我正在尝试编写一个shell脚本,通过删除与特定模式匹配的文件来清理目录。我的代码适用于所有模式,但如果文件名以空格开头。虽然我们可以通过rm \ *
删除以空格开头的文件,但是如果我将此模式传递给我的脚本,它将不会删除以空格开头的文件。这是我的代码:
for file in *;do
for pattern in $*; do
if [[ -f "$file" && "$file" == $pattern ]]; then
rm "$file"
fi
done
done
我也试过这个更简单的代码,但同样的问题!
for pattern in $*; do
if [[ -f $pattern ]]; then
rm $pattern
fi
done
你能帮我解决为什么只有以空格开头的文件出现问题?!
答案 0 :(得分:1)
而不是$*
,如果您使用special parameter $@
,则列表中的项目将以围绕它们的引号开头。您仍然需要引用您使用它们的变量。
重新编写第二个例子,即
for pattern in "$@"; do
if [[ -f "$pattern" ]]; then
rm -f "$pattern"
fi
done
答案 1 :(得分:0)
这真是一个具有挑战性的问题 首先请看下面的例子
[shravan@localhost mydir]$ ls " myfile"
myfile
[shravan@localhost mydir]$ echo $vr1
" myfile"
[shravan@localhost mydir]$ ls $vr1
ls: ": No such file or directory
ls: myfile": No such file or directory
[shravan@localhost mydir]$ vr2=" myfile"
[shravan@localhost mydir]$ echo $vr2
myfile
你可以在上面看到ls" MYFILE"正在工作,但在变量vr1或vr2中分配此值后它无法正常工作。 因此,如果存在与否,我们无法检查文件。
对于解决方案,请将所有模式保存在文件中,并将所有模式保存为双引号。见下面的例子。
[shravan@localhost mydir]$ touch " myfile"
[shravan@localhost mydir]$ touch my.pl
[shravan@localhost mydir]$ ls
exe.sh findrm inp input myfile my.pl pattern text text1
[shravan@localhost mydir]$ cat inp
" myfile"
"my.pl"
[shravan@localhost mydir]$ cat inp | xargs rm
[shravan@localhost mydir]$ ls
exe.sh findrm inp input pattern text text1
删除文件。或者,如果您有很多模式,并且不想为它们添加引号,请使用以下内容。
cat inp | awk '{print "\""$0"\""}' | xargs rm
是的,如果找不到文件,那么它将为该文件提供错误
rm: cannot remove ` myfile': No such file or directory
答案 2 :(得分:0)
for file in *;do
for pattern in "$@"; do
if [[ -f "$file" && "$file" == $pattern ]]; then
rm "$file"
fi
done
done
如果我们只是将$ @更改为引用“$ @”,那么每个单独的参数将被包装在双引号中,并且不会丢失任何空格。另一方面,我们需要在==运算符右侧使用带引号的字符串,因为当在[[]]中使用'=='运算符时,运算符右侧的字符串被视为模式。但是在这里我们不会引用$ pattern,因为列表中的所有参数都包含双引号。