Find
具有相同 md5 和的輸出行
我有這樣的腳本
find path -type f -exec md5sum {} +'
有這個結論
/tmp ❯ find $pwd -type f -exec md5sum {} + \a7c8252355166214d1f6cd47db917226 ./guess.bash e1c06d85ae7b8b032bef47e42e4c08f9 ./qprint.bash 8d672b7885d649cb76c17142ee219181 ./uniq.bash 2d547f5b610ad3307fd6f466a74a03d4 ./qpe 523166a51f0afbc89c5615ae78b3d9b0 ./Makefile 57a01f2032cef6492fc77d140b320a32 ./my.c c5c7b1345f1bcb57f6cf646b3ad0869e ./my.h 6014bc12ebc66fcac6460d634ec2a508 ./my.exe 0ff50f0e65b0d0a5e1a9b68075b297b8 ./levik/2.txt 5f0650b247a646355dfec2d2610a960c ./levik/1.txt 5f0650b247a646355dfec2d2610a960c ./levik/3.txt
我們需要這樣的結論
5f0650b247a646355dfec2d2610a960c ./levik/1.txt 5f0650b247a646355dfec2d2610a960c ./levik/3.txt
如果您有 GNU
uniq
,您可以要求它顯示所有重複前 32 個字元的行¹:find path -type f -exec md5sum {} + | sort | uniq -D -w32
該列表需要排序,因為
uniq
只發現連續的重複項。這也假設所有文件路徑都不包含換行符;要處理這個問題,假設所有工具的 GNU 實現,請使用:find . -type f -exec md5sum -z {} + | sort -z | uniq -z -D -w32 | tr '\0' '\n'
(GNU
md5sum
有自己的方式來處理文件名中的特殊字元,但這會產生不能以uniq
上述方式使用的輸出。)¹ 從技術上講,在目前版本的 GNU
uniq
中,考慮的是前 32個字節,例如 UTF-8 編碼á
和é
字元將被視為相同,uniq -w1
因為它們的編碼都以 0xc3 字節開頭。但是,對於在十六進制編碼的 MD5 和中發現的 0-9a-f 字元,這沒有什麼區別,因為這些字元總是編碼在一個字節上。
如果您的任務是查找重複文件,您還可以使用
fdupes
:在給定路徑中搜尋重複文件。通過比較文件大小和 MD5 簽名,然後逐字節比較來找到此類文件。
fdupes -r .