匹配备份文件(`* ~`)

时间:2014-02-18 14:11:52

标签: regex bash match filenames

我正在尝试匹配脚本中的备份文件,然后将其删除。备份文件包含波形符(~):

$ ls -al
drwxr-xr-x 3 jwalton jwalton 4096 Feb 18 09:00 .
drwxr-xr-x 5 jwalton jwalton 4096 Feb 18 08:54 ..
drwxr-xr-x 5 jwalton jwalton 4096 Feb 18 08:54 test-proj
-rwxr-xr-x 1 jwalton jwalton  664 Feb 18 09:00 clean.sh
-rwxr-xr-x 1 jwalton jwalton  628 Feb 18 08:59 clean.sh~

我的干净脚本有以下测试,但看起来我做错了什么:

if [ -e "*~" ]; then
  rm "*~"
fi

匹配备份文件的正确测试是什么?

4 个答案:

答案 0 :(得分:7)

您无需进行测试。 rm -f(忽略不存在的文件)将完成这项工作。

rm -f *~

在引文中,*字面匹配*

示例:

$ ls
*~  a  a~
$ ls *~
*~  a~
$ ls "*~"
*~

答案 1 :(得分:5)

这是你的报价搞砸了。它正在寻找一个字面上称为*~的文件。这有效,但仅当*~扩展到一个文件::

if [ -e *~ ]; then
   rm *~
fi

为什么呢?因为shell会先扩展通配符 。所以如果它什么都不匹配,那就相当于:

if [ -e ]; then  // false positive!

如果它与一个文件x.txt~匹配,则会扩展为:

if [ -e x.txt~ ]; then // OK

如果匹配多个文件x.txt~ y.txt~,则会扩展为:

if [ -e x.txt~ y.txt~ ]; then // "[: x.txt~: binary operator expected"

值得知道的是,UNIX文件名可以包含除/和ASCII 0之外的任何字符。所以你可以这样做:

 $ touch "*~"
 $ ls "*~"
 *~
 $ rm "*~"

您最终可能会遇到名称尴尬的文件,例如-r

 $ touch -- -r  # or imagine, your own C, Java etc. program
 $ ls
 -r
 $ rm -- -r

但是,if并不是必需的。这只是为了防止ls出现No such file or directory错误,您可以通过以下方式禁止这些错误:

rm -f *~

答案 2 :(得分:1)

我觉得使用find是最好的:

find ./ -name "*~" -exec rm {} \; 

答案 3 :(得分:1)

如果要以递归方式下降到子目录中:

shopt -s globstar nullglob
rm **~