删除shell脚本中以空格开头的文件

时间:2015-08-01 03:35:24

标签: bash shell arguments space argument-passing

我正在尝试编写一个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

你能帮我解决为什么只有以空格开头的文件出现问题?!

3 个答案:

答案 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,因为列表中的所有参数都包含双引号。