基本循環的文檔:
import glob
import hashlib
uniq = set()
for fname in glob.glob('*.txt'):
with open(fname,"rb") as f:
sig = hashlib.sha256(f.read()).digest()
if sig not in uniq:
uniq.add(sig)
print fname
else:
print fname, " (duplicate)"
請注意與任何哈希函數存在的collision輕微的機會。這是兩個具有相同摘要的不同文件。根據你的需要,這是不可接受的。
根據Thomas Pornin in an other answer:
「例如,與SHA-256(N = 256)和一個十億消息(P = 10),則概率[碰撞]約爲4.3 * 10 -60。「
鑑於你的需要,如果你有爲了識別「真」的重複,改變sig = ....
行任何適合你檢查的附加屬性。例如,如果您需要檢查「相同的內容」,並(通過os.stat()
返回st_uid
)「相同的所有者」,寫:
sig = (hashlib.sha256(f.read()).digest(),
os.stat(fname).st_uid)
使用[hashlib](https://docs.python.org/3/library/hashlib.html)就足夠了嗎? – bvidal 2014-09-01 14:36:09
_「檢查每個元數據」_什麼是你的「重複」?相同的內容?或相同的內容和相同的元數據(哪些?) – 2014-09-01 14:39:50
什麼是你的操作系統? – Kasramvd 2014-09-01 14:46:03