首先我假設你有一個目錄中所有文件的列表。它可能是一個純文本文件。讓我們把它list
那麼這一個班輪將完成這項工作:
sort list|awk '{if(p&&$0~p"e+$")print "rm "$0;p=$0}'
這條線上面會打印rm foo
命令,foo
是重複的文件。讓我們舉個例子:
kent$ cat list
index.html
logo.png
logo.pnge
package.zip
index.htmle
index.htmlee
package.zipe
file.exe
file.exee
file.exeee
kent$ sort list|awk '{if(p&&$0~p"e+$")print "rm "$0;p=$0}'
rm file.exee
rm file.exeee
rm index.htmle
rm index.htmlee
rm logo.pnge
rm package.zipe
你可以看到,所有的重複文件都在產生rm command
。如果要執行,只是管道線|sh
這樣:
sort list|awk '{if(p&&$0~p"e+$")print "rm "$0;p=$0}'|sh
編輯
這是很好的做法來包裝與報價文件名,因爲文件名可以有空格和其他特殊字符:
sort list|awk '{if(p&&$0~p"e+$")print "rm \""$0"\"";p=$0}'
是例如已知的擴展名。 (只有exe,png,zip,txt ....)或者它可以任何東西? – Kent 2013-04-24 13:44:31
不幸的是它可以是任何東西。 – hsz 2013-04-24 13:45:46
好的,如果它可以是任何東西,你怎麼能告訴'ee.e'和'ee.ee'和'ee.eee'是'ee.e'三個不同的文件或全部的文件?或者'ee.e'和'ee.ee'是不同的文件,'ee.eee'是'ee.ee'的二重奏? – Kent 2013-04-24 13:51:00