2014-02-18 64 views
2

我試圖匹配腳本中的備份文件,然後刪除它們。備份文件是在他們的波浪(~)中的那些:匹配備份文件(`*〜`)

$ 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 

什麼是匹配備份文件的正確測試嗎?

+1

例如,用'ls'替換'rm'來測試它。 – fedorqui

回答

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 *~ 
+1

'[-e *〜]'只有在模式擴展到一個文件時纔會起作用;否則,你會得到一個關於二元運算符預期的錯誤。 – chepner

+0

@chepner優秀點;添加到身體。 – slim

7

你並不需要對其進行測試。 rm -f(忽略不存在的文件)將完成這項工作。

rm -f *~ 

報價裏面,*匹配*字面上:

例子:

$ ls 
*~ a a~ 
$ ls *~ 
*~ a~ 
$ ls "*~" 
*~ 
+0

感謝falsetru。我試圖首先匹配它的原因是爲了避免「*〜not found」錯誤信息。 – jww

+2

@noloader,如果你使用'-f'選項,'rm'不會輸出有關的錯誤。 – falsetru

+1

這是因爲'〜'沒有在雙引號內擴展。 – fedorqui

1

我猜使用find是最好的:

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

'發現。 -name「*〜」-print | xargs rm -f' - 效率稍高一些。 – slim

+1

'find。 -name「*〜」-delete「 - 效率更高 – Biffen

+0

@Diffen Doh。我爲'-rm'找到了'man find' – slim

1

如果你想遞歸下降到子目錄:

shopt -s globstar nullglob 
rm **~