我正在處理大量(30,000)大小約爲10MB的文件。其中一些(我估計2%)實際上是重複的,並且我需要僅保留每個重複對(或三重)的副本。 你會建議我一個有效的方法來做到這一點?我正在研究unix。刪除UNIX中的相同文件
謝謝你:-)
我正在處理大量(30,000)大小約爲10MB的文件。其中一些(我估計2%)實際上是重複的,並且我需要僅保留每個重複對(或三重)的副本。 你會建議我一個有效的方法來做到這一點?我正在研究unix。刪除UNIX中的相同文件
謝謝你:-)
我會寫一個腳本來創建每個文件的散列。您可以將散列存儲在一個集合中,遍歷這些文件,並將文件哈希轉換爲集合中已經找到的值,然後刪除該文件。例如,這在Python中很容易實現。
對於30,000個文件,每個哈希表條目爲64個字節,您只能看到大約200兆字節。
什麼是元字節?某種理想化的字節?如果你有一個完美的散列函數,你的解決方案纔有效。 – 2010-03-08 10:30:38
什麼*不是* metabyte?固定。偏執狂可以在刪除的情況下比較文件的內容。添加一個額外的散列也有幫助。 – Joe 2010-03-08 10:40:20
@Neil如果你使用一個現代的,目前不間斷的密碼散列函數,並且你發現了一個衝突,你的算法就會失效,但是你已經獲得了一張密碼文件,所以這都是勝利。不過,在刪除其中一個之前,應該比較所假設的重複項。 – 2010-03-08 12:28:10
編寫一個腳本,首先比較文件大小,然後MD5校驗和(緩存它們,當然),如果您非常擔心丟失數據,則會咬住項目符號並實際比較重複的候選字節。如果您沒有關於文件如何成爲等的其他知識,則無法真正做到更有效。
這是一個來自不同來源的高通下載,所以我得到了一些冗餘。 我會嘗試md5sum,所以我應該得到他們所有的哈希碼。我會讓你知道它是否有效:-) – 2010-03-08 10:43:04
查找可能的重複文件:
find DIR -type f -exec sha1sum "{}" \; | sort | uniq -d -w40
現在你可以使用cmp
檢查該文件確實是相同的。
你可以試試這段代碼,在刪除之前首先獲取所有重複項。 。在每次迭代通過使用命令「比較與其他文件內容的文件內容
find /path -type f -print0 | xargs -0 sha512sum | awk '($1 in seen){print "duplicate: "$2" and "seen[$1] }(!($1 in seen)){seen[$1]=$2}'
保存所有在該文件中的陣列。然後名稱橫穿陣列md5sum'.If它是相同,則刪除該文件。
例如,這裏文件'b'是文件'a'的副本,所以md5sum對於這兩個文件都是相同的。
您可能想考慮該特定方法的算法複雜性... – hop 2010-03-08 11:26:26
重複可基於以下 1.內容 2名 你想怎麼辦? – coder 2010-03-08 10:26:49
內容:-) 基於文件名將太容易 – 2010-03-08 12:40:15