2011-11-27 94 views
2

我在目錄中有大約20個文件,其中一些文件是重複的。由於它們有不同的名稱,我如何識別哪些是重複的,以便我可以刪除它們。識別重複項並刪除

在做了一些研究後,我發現可以使用md5或cksum工具,但我似乎無法使所有的工作。

回答

1

您可以使用awk單行標識來識別重複文件。

讓我們創建一些文件,其中一些文件是重複的。

[jaypal~/Temp]$ cat a.txt 
jaypal 
[jaypal~/Temp]$ cat b.txt 
singh 
[jaypal~/Temp]$ cat c.txt 
jaypal 
[jaypal~/Temp]$ cat d.txt 
ayaplj 

從輸出上面顯示我們知道,文件A.TXTc.txt是確切的重複。文件d.txt儘管已將我的名字重新排列,但不能歸類爲重複。

我們將在每個文件上使用cksum實用程序並將輸出捕獲到單獨的文件中。

[jaypal~/Temp]$ cksum a.txt b.txt c.txt d.txt > cksum.txt 
[jaypal~/Temp]$ cat cksum.txt 
3007025847 7 a.txt 
1281385283 6 b.txt 
3007025847 7 c.txt 
750690976 7 d.txt 

注:我用上面的方法,因爲當時只有4這個演示文件。如果你有幾百個文件來檢查dups然後使用一個簡單的for loop

[jaypal~/Temp]$ for i in ./*.txt; do cksum $i >> cksum1.txt; done 
[jaypal~/Temp]$ cat cksum1.txt 
3007025847 7 ./a.txt 
1281385283 6 ./b.txt 
3007025847 7 ./c.txt 
750690976 7 ./d.txt 

現在,我們有我們可以利用這個與我們awk一行代碼來識別重複的cksum.txt文件。

[jaypal~/Temp]$ awk 'NR==FNR && a[$1]++ { b[$1]; next } $1 in b' cksum.txt cksum.txt 
3007025847 7 a.txt 
3007025847 7 c.txt 

這將列出您的目錄中具有多個副本的所有文件。 請注意刪除這些文件中的任何一個,而不是兩者。 :)您可以將輸出始終輸送到sort以使它們按順序排列。

或者,您可以執行以下操作來獲取單個重複文件,而不是獲取兩個副本。我不太喜歡這一個的原因是因爲它沒有告訴我它是哪個重複的。

[jaypal~/Temp]$ awk '{ x[$1]++; if (x[$1]>1) print $0}' cksum.txt 
3007025847 7 c.txt 
0

可以使用sum命令爲文件生成校驗和,例如:sum FILENAME。如果兩個文件具有相同的校驗和,則極有可能(儘管取決於校驗和算法,並非100%保證)它們是相同的。

1

首先,把所有的cksums與他們從到一個臨時文件中的文件:

cksum * > /tmp/blah

然後排序和uniquify基於前10個字符的文件(校驗和自身),保持在受騙者

sort /tmp/blah | uniq -w 10 -d > /tmp/blah.dups

然後刪除那些的DUP:

cut -d" " -f3 /tmp/blah.dups | xargs rm

+0

而如何保持重複文件的一個副本?這將刪除所有副本,除非我錯過了某些內容,並且在刪除所有副本時確實會刪除重複內容,但大多數人希望保留每個文件的一個副本。 –

+1

這不起作用。 ''uniq -d'永遠不會顯示任何重複項,因爲'/ tmp/blah'中的每一行都包含校驗和和文件名(實際上你在最後一條命令中依賴這個)。 –

+0

輕鬆修復。向uniq添加一個'-w 10'。我會編輯答案來說明。 – drysdam