2013-04-24 40 views
0

我有一個包含有不同的擴展許多文件大的文件系統結構刪除在linux FS重複的文件,例如

index.html 
logo.png 
package.zip 

許多文件都具有與在末尾添加e信件副本,所以:

index.htmle 
index.htmlee 
package.zipe 

等等。

我必須遞歸刪除每個帶有e+$的重複文件。但是,如果有文件

file.exe 

應該刪除

file.exee 
file.exeee 

但不

file.exe 

什麼來刪除這些文件的最好方法?

+0

是例如已知的擴展名。 (只有exe,png,zip,txt ....)或者它可以任何東西? – Kent 2013-04-24 13:44:31

+0

不幸的是它可以是任何東西。 – hsz 2013-04-24 13:45:46

+0

好的,如果它可以是任何東西,你怎麼能告訴'ee.e'和'ee.ee'和'ee.eee'是'ee.e'三個不同的文件或全部的文件?或者'ee.e'和'ee.ee'是不同的文件,'ee.eee'是'ee.ee'的二重奏? – Kent 2013-04-24 13:51:00

回答

2

首先我假設你有一個目錄中所有文件的列表。它可能是一個純文本文件。讓我們把它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}' 
+0

它像一個魅力。我喜歡你在執行'rm'前打印文件的方式,它可以讓我檢查列表。你是個好人! – hsz 2013-04-24 14:35:29

+0

忘記提及,在'list'中,請不要包含任何空行。它可以被檢查,但我沒有這樣做的答案。 – Kent 2013-04-24 14:36:56

+0

當然可以。我已經通過'find找到了我的列表。 > list',所以它給我保存結果。 – hsz 2013-04-24 14:39:45

0

你需要找到一個在 「E」 結尾的所有文件

find ./ -name "*e" 

這時就需要逆向排序命名更長的名字排在前面

| sort -r 

然後去掉「E」

chk4File=`echo $FILE | sed -e 's/e$//g'` 

,然後比較,以確保它的存在與「E」刪除文件之前,最後

if [ "${FILE}" != "${chk4File}" ] && [ -e ${chk4File} ]; then 

把它放在一起...該示例不會刪除任何文件...只是告訴你哪些將被刪除或不... ...我建議在沒有刪除任何文件的情況下進行測試運行並在真正刪除之前查看結果。只需從rm命令中刪除#進入即可。

#!/bin/sh 
for FILE in `find ./ -name "*e" | sort -r` 
do 
    chk4File=`echo $FILE | sed -e 's/e$//g'` 
    if [ "${FILE}" != "${chk4File}" ] && [ -e ${chk4File} ]; then 
     echo "Removing ${FILE} since ${chk4File} was found.." 
     #rm -rf ${FILE} 
    else 
     echo "NOT Removing ${FILE} since ${chk4File} was NOT found.." 
    fi