从计算机中删除重复图像文件的最佳方法是什么?

Bio*_*eek 14 windows python deduplication image-processing

我的 Windows 计算机上有很多重复的图像文件,它们位于不同的子文件夹中,并且具有不同的文件名。

您会推荐什么 Python 脚本或免费软件程序来删除重复项?

(我读过这个类似的问题,但那里的海报询问了不同文件大小的视觉重复。我的是具有不同文件名的完全重复。)

Ken*_*ric 17

不要依赖 MD5 和。

MD5 总和不是检查重复项的可靠方法,它们只是检查差异的一种方法。

使用MD5查找可能的 候选重复项,然后为每对共享一个 MD5

  1. 打开两个文件
  2. 在这些文件中向前查找,直到一个不同。

看到我被那些以天真的方法提交重复身份的人拒绝投票,如果你要完全依赖哈希算法,看在上帝的份上,使用更难的东西,比如 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 个组合?我认为这不太可能。

最不天真的方式

清除重复项的最简单,也是最快的方法如下。

  1. 按大小:不同大小的文件不能相同。这需要很少的时间,因为它甚至不必打开文件。
  2. 按 MD5:具有不同 MD5/Sha 值的文件不能相同。这需要更长的时间,因为它必须读取文件中的所有字节并对它们执行数学运算,但它可以更快地进行多次比较。
  3. 上述差异失败:执行文件的逐字节比较。这是一个执行起来很慢的测试,这就是为什么它被保留到所有其他消除因素都被考虑之后。

Fdupes 就是这样做的。并且您应该使用使用相同标准的软件。

  • 从字面上看,您的硬盘驱动器更有可能神奇地破坏图像,而不是 MD5 会发生碰撞。“仅用 2^128 个组合表示 2^100,000,000,000 个组合” - 我在这里同意你的看法。如果他有 2^100,000,000,000 张图片,MD5(或几乎任何哈希算法)都会很糟糕。 (7认同)
  • 没有*保证,只是*不太可能*。它*并非*不可能。很可能有 10 个文件相互冲突,但都完全不同。这不太可能,但可能会发生,因此您必须对其进行测试。 (4认同)
  • @Kent - 我 100% 同意你的看法。忽视某事是懒惰的,因为它不太可能,甚至像我们所说的那样不太可能。如果我的一些数据被破坏,我会很生气,因为编写程序的人认为有些东西不太可能打扰编码。 (3认同)
  • 文件大小,然后是 MD5,然后是字节检查。 (2认同)

小智 10

它是unix(包括linux)操作系统或安装了Cygwin的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'
Run Code Online (Sandbox Code Playgroud)

如果您知道没有故意制造的碰撞,则可以使用 md5sum(大约快 50%)(与找到一次自然发生的 md5 碰撞的机会相比,您赢得 10 个主要彩票的机会更大。)

如果您想查看您拥有的所有副本而不是删除它们,只需将unlink $file部分更改为print $file, "\n".


Shr*_*saR 6

我在 Unix 系统上使用过fdupes(用 C 编写)和freedups(Perl),它们也可以在 Windows 上工作;还有一些类似的声称可以在 Windows 上运行:dupmergeliten(用 Python 编写)等。