我有一个这样的脚本
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
答案1
如果您的任务是查找重复文件,您还可以使用fdupes
:
在给定路径中搜索重复文件。通过比较文件大小和 MD5 签名,然后逐字节比较来找到此类文件。
fdupes -r .
答案2
如果您有 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
上面所示的方式使用。)
1 从技术上讲,在当前版本的 GNU 中uniq
,它是前 32 个字节例如,UTF-8 编码á
和é
字符将被视为相同,uniq -w1
因为它们的编码均以 0xc3 字节开头。不过,对于十六进制编码的 MD5 和中的 0-9a-f 字符来说,这没有什么区别,因为这些字符始终编码在一个字节上。