我的 Windows 计算机上有很多重复的图像文件,位于不同的子文件夹中,并且文件名也不同。
您会推荐什么 Python 脚本或免费软件程序来删除重复项?
(我读了这类似的问题,但那里的发帖人询问的是具有不同文件大小的视觉重复。我的是具有不同文件名的完全重复。)
答案1
不要依赖 MD5 总数。
MD5 总和不是检查重复的可靠方法,它们只是检查差异的一种方法。
使用 MD5 查找可能的 候选人重复项,然后对每对共享 MD5
- 打开两个文件
- 在这些文件中向前搜索,直到有一个文件不同。
看到我被那些采取幼稚方法归档重复身份的人否决了,如果你要依赖完全在哈希算法上,看在上帝的份上,使用更强大的算法,如 SHA256 或 SHA512,至少通过检查更多位,你可以将概率降低到合理的程度。MD5 对于碰撞条件来说非常弱。
我还建议人们阅读此处标题为“文件检查”的邮件列表:http://london.pm.org/pipermail/london.pm/Week-of-Mon-20080714/thread.html
如果您说“MD5 可以唯一地标识所有文件”,那么您就犯了逻辑错误。
给定一个值范围,长度从 40,000 字节到 100,000,000,000 字节不等,该范围可用的组合总数大大超过了 MD5 可能表示的值的数量,长度只有 128 位。
仅用 2^128 种组合来表示 2^100,000,000,000 种组合?我认为不太可能。
最不幼稚的方法
删除重复项的最简单且最快的方法如下。
- 按尺寸:不同大小的文件不能相同。这花费的时间很少,因为甚至不需要打开文件。
- 通过 MD5:具有不同 MD5/Sha 值的文件不可能相同。这会花费更长的时间,因为它必须读取文件中的所有字节并对其进行数学运算,但它可以加快多次比较的速度。
- 缺乏上述差异:对文件进行逐字节比较。这是一项执行起来很慢的测试,这就是为什么要等到考虑完所有其他排除因素后再进行。
重复项这样做。你应该使用采用相同标准的软件。
答案2
在安装了 Cygwin 的类 UNIX(包括 Linux)操作系统或 Windows 上,这是一行程序:
find . -type f -print0 | xargs -0 shasum | sort |
perl -ne '$sig=substr($_, 0, 40); $file=substr($_, 42); \
unlink $file if $sig eq $prev; $prev = $sig'
如果您知道没有故意制造的碰撞,则可以使用 md5sum(速度大约快 50%)(您赢得 10 次大奖的机会比找到一次自然发生的 md5 碰撞的机会更大。)
如果您想要查看所有重复项而不是删除它们,只需将部分更改unlink $file
为print $file, "\n"
。
答案3
答案4
一个选择是复制者。
DupKiller 是搜索和删除计算机上重复或相似文件的最快、最强大的工具之一。其搜索机制中内置的复杂算法可实现高结果 — 快速文件搜索。大量选项允许灵活地自定义搜索。