Find

具有相同 md5 和的輸出行

  • January 19, 2022

我有這樣的腳本

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'

(GNUmd5sum自己的方式來處理文件名中的特殊字元,但這會產生不能以uniq上述方式使用的輸出。)


¹ 從技術上講,在目前版本的 GNUuniq中,考慮的是前 32個字節,例如 UTF-8 編碼áé字元將被視為相同,uniq -w1因為它們的編碼都以 0xc3 字節開頭。但是,對於在十六進制編碼的 MD5 和中發現的 0-9a-f 字元,這沒有什麼區別,因為這些字元總是編碼在一個字節上。

如果您的任務是查找重複文件,您還可以使用fdupes

在給定路徑中搜尋重複文件。通過比較文件大小和 MD5 簽名,然後逐字節比較來找到此類文件。

fdupes -r .

引用自:https://unix.stackexchange.com/questions/686980