通过 MD5 哈希查找所有重复文件

通过 MD5 哈希查找所有重复文件

我正在尝试查找所有重复文件(基于 MD5 哈希)并按文件大小排序。到目前为止,我有以下内容:

find . -type f -print0 | xargs -0 -I "{}" sh -c 'md5sum "{}" |  cut -f1 -d " " | tr "\n" " "; du -h "{}"' | sort -h -k2 -r | uniq -w32 --all-repeated=separate

输出结果为:

1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture.sh
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture2.sh
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture2.s

d41d8cd98f00b204e9800998ecf8427e 0      ./test(1).log

这是最有效的方法吗?

答案1

来自“man xargs”:-I 意味着 -L 1 因此这不是最高效的。如果您只为 md5sum 提供尽可能多的文件名,那么效率会更高,即:

find . -type f -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate

那么你当然不会知道文件大小。如果你真的需要知道文件大小,可以创建一个 shell 脚本,执行md5sumdu -h并将行合并到 中join

答案2

有时,我们正在处理精简的 Linux 命令集,例如 busybox 或 NAS 和其他 Linux 嵌入式硬件 (IoT) 附带的其他东西。在这些情况下,我们不能使用诸如 之类的选项-print0,这会导致命名空间出现问题。因此,我们可能更喜欢:

find | while read file; do md5sum "$file"; done > /destination/file

然后,我们/destination/file就准备好像往常一样进行任何类型的流程sortuniq

答案3

使用 btrfs + duperemove 或 zfs 进行在线重复数据删除。它在文件系统级别工作,将匹配相等的文件部分,然后使用文件系统的 CoW 仅保留每个文件部分中的一个,同时保留文件。当您修改其中一个文件中的共享部分时,它将单独写入更改。这样,您就可以让 /media 和 /backup/media-2017-01-01 等内容仅消耗两个树中每个唯一信息的大小。

相关内容