我正在尝试匹配脚本中的备份文件,然后将其删除。备份文件包含波形符(~
):
$ 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
匹配备份文件的正确测试是什么?
答案 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 **~