2010-03-08 48 views
3

我正在處理大量(30,000)大小約爲10MB的文件。其中一些(我估計2%)實際上是重複的,並且我需要僅保留每個重複對(或三重)的副本。 你會建議我一個有效的方法來做到這一點?我正在研究unix。刪除UNIX中的相同文件

謝謝你:-)

+0

重複可基於以下 1.內容 2名 你想怎麼辦? – coder 2010-03-08 10:26:49

+0

內容:-) 基於文件名將太容易 – 2010-03-08 12:40:15

回答

2

我會寫一個腳本來創建每個文件的散列。您可以將散列存儲在一個集合中,遍歷這些文件,並將文件哈希轉換爲集合中已經找到的值,然後刪除該文件。例如,這在Python中很容易實現。

對於30,000個文件,每個哈希表條目爲64個字節,您只能看到大約200兆字節。

+0

什麼是元字節?某種理想化的字節?如果你有一個完美的散列函數,你的解決方案纔有效。 – 2010-03-08 10:30:38

+0

什麼*不是* metabyte?固定。偏執狂可以在刪除的情況下比較文件的內容。添加一個額外的散列也有幫助。 – Joe 2010-03-08 10:40:20

+0

@Neil如果你使用一個現代的,目前不間斷的密碼散列函數,並且你發現了一個衝突,你的算法就會失效,但是你已經獲得了一張密碼文件,所以這都是勝利。不過,在刪除其中一個之前,應該比較所假設的重複項。 – 2010-03-08 12:28:10

1

編寫一個腳本,首先比較文件大小,然後MD5校驗和(緩存它們,當然),如果您非常擔心丟失數據,則會咬住項目符號並實際比較重複的候選字節。如果您沒有關於文件如何成爲等的其他知識,則無法真正做到更有效。

+0

這是一個來自不同來源的高通下載,所以我得到了一些冗餘。 我會嘗試md5sum,所以我應該得到他們所有的哈希碼。我會讓你知道它是否有效:-) – 2010-03-08 10:43:04

2

查找可能的重複文件:

find DIR -type f -exec sha1sum "{}" \; | sort | uniq -d -w40 

現在你可以使用cmp檢查該文件確實是相同的。

+0

-w是gnu uniq的一個特性; -d只會找到連續的重複項,所以你必須先排序 – hop 2010-03-08 11:33:30

+0

你是對的。固定。 – 2010-03-08 12:11:04

+0

您可以將'sort'的輸出傳遞給'cut -d \ -f 1',然後將其傳遞給'uniq -d',而不是使用'-w'(僅在GNU中) 。這更便攜。它將在BSD,OS X和其他系統上工作。 – monokrome 2013-07-14 22:13:05

2

你可以試試這段代碼,在刪除之前首先獲取所有重複項。 。在每次迭代通過使用命令「比較與其他文件內容的文件內容

find /path -type f -print0 | xargs -0 sha512sum | awk '($1 in seen){print "duplicate: "$2" and "seen[$1] }(!($1 in seen)){seen[$1]=$2}' 
0

保存所有在該文件中的陣列。然後名稱橫穿陣列md5sum'.If它是相同,則刪除該文件。

例如,這裏文件'b'是文件'a'的副本,所以md5sum對於這兩個文件都是相同的。

+0

您可能想考慮該特定方法的算法複雜性... – hop 2010-03-08 11:26:26