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


14

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

您会建议使用哪种Python脚本或免费程序删除重复项?

(我读过这个类似的问题,但那里的海报询问的是文件大小不同的视觉重复项。我的人是文件名不同的精确重复项。)


2
请记住,即使所有像素都相同,它们仍可能具有不同的EXIF信息(由在某些阶段处理图像的程序进行修改),这会给大多数当前提出的解决方案带来问题。
user12889 2010年

Answers:


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做到了。并且您应该使用使用相同条件的软件。


7
实际上,硬盘驱动器会神奇地破坏映像,而不是MD5会发生冲突。“仅用2 ^ 128个组合代表2 ^ 100,000,000,000个组合”-我在这里同意您的观点。如果他有2千亿张图片,那么MD5(或几乎任何哈希算法)将是不好的。
格雷格·迪恩

4
没有保证,那是不可能的。这不是没有可能。很有可能会有10个文件相互冲突,但是完全不同。这不太可能,但是有可能发生,因此您必须对其进行测试。
肯特·弗雷德里克

2
文件大小,然后是MD5,然后是逐字节检查。
布拉德·吉尔伯特

3
@肯特-我100%同意您的意见。忽略某些事物是懒惰的,因为它不太可能发生,即使像我们所说的那样也不可能。如果我的某些数据被破坏只是因为编写该程序的人以为某些事情不太可能为编码而烦恼,那我会很生气。
乔·泰勒

10

这是在安装了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'

如果您知道没有故意创建的冲突(可以比发现一个自然发生的md5冲突更好的机会赢得10个主要彩票,则可以使用md5sum(速度快50%))。

如果要查看所有的小样,而不是删除它们,只需将其更改为unlink $file即可print $file, "\n"


1
您也可以使用-print0和xargs-0来捕获空格,但是find还有一个-exec选项,在这里很有用:find。-类型f -exec shasum {} \; | sort ...另外:您不应使用@F(-a),因为它不能与空格一起使用。尝试使用substr。

打个招呼,地球车。用您的建议更新了答案。

正是- “的md5sum(其中约50%的速度)可以,如果你知道有没有刻意制造冲突中使用”
格雷格·迪安

6

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


假设文件系统的详细信息无关紧要,Perl和Python软件在Windows和* nix系统上应能完全相同。
CarlF

2

要在Windows上删除重复的图像,请查看DupliFinder。 它可以按照各种标准(例如名称,大小和实际图像信息)比较图片。

有关删除重复文件的其他工具,请参阅此Lifehacker 文章。


1

代替DupliFinder,请尝试使用分支的项目DeadRinger。我们已经修复了原始项目中的大量错误,添加了许多新功能,并显着提高了性能。


1

一种选择可以是Dupkiller

DupKiller是用于搜索和删除计算机上重复或相似文件的最快,最强大的工具之一。内置于其搜索机制中的复杂算法可以实现很高的结果-快速文件搜索。许多选项可以灵活地自定义搜索。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.