如何打印给定目录中的所有重复(相同内容)文件?

时间:2015-04-16 12:52:53

标签: python file compare hashtable

我是Python的新手,这是我第一次尝试编写脚本。 我需要遍历一个给定的目录并打印出所有重复的文件(具有相同内容的文件)。如果有重复文件集,那么我需要在不同的行中打印它们。

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

是的,创建一个以文件大小为键的字典,以及以该大小作为值的所有文件的列表,然后只比较相同大小的文件是一个好策略。但是,您可以采取另一个步骤来提高效率。

一旦您确定了相同大小的文件列表,而不是费力地逐字节地比较列表中的每对文件(并在找到不匹配时立即返回),您可以比较他们的digital fingerprints

指纹识别算法(也称为消息摘要)接收一串数据并返回一个短字符串,该字符串(希望)对该输入字符串是唯一的。因此,要查找重复文件,您只需生成每个文件的指纹,然后查看是否有任何指纹重复。这通常比实际比较文件内容快 lot ,因为如果你有一个指纹列表,你可以轻松地对它进行排序,所以具有相同指纹的所有文件将在排序中彼此相邻列表。

使用通常用于指纹识别的功能,具有相同指纹的两个文件实际上相同的可能性很小。因此,一旦您识别出具有匹配指纹的文件,您仍然需要比较它们的字节内容。但是,在那些非常罕见的情况下,两个不相同的文件具有匹配的指纹,文件内容通常会有很大差异,因此可以快速消除这种误报。

两个不相同的文件具有匹配指纹的几率非常小,除非您有数千个文件要重复数据删除,否则您可以跳过按大小分组文件的第一步,然后直接进行指纹识别。

我在上面链接的关于指纹识别的维基百科文章提到Rabin fingerprint是一种非常快速的算法。 在PyPI上可用的第三方Python模块 - PyRabin 0.5,但我从未使用它。

但是,标准的Python hashlib模块提供了各种安全散列和消息摘要算法,例如MD5和SHA系列,它们相当快,并且对于大多数经验丰富的Python程序员来说都非常熟悉。对于此应用程序,我建议使用返回指纹相当短的算法,例如sha1()md5(),因为它们往往更快,但指纹越短,速率越高碰撞尽管MD5并不像以前认为的那样安全,但它仍然适用于此应用程序,除非您需要处理由恶意人员创建的文件,这些人使用相同的MD5指纹创建不相同的文件故意。

如果您希望获得大量重复文件,另一个选择是计算两个不同的指纹(例如SHA1和MD5) - 两个不相同的文件具有匹配的SHA1和MD5指纹的几率在微观上很小。

FWIW,这里是我去年写的一个简单的Python程序的链接(在Unix和Linux Stack交换网站的答案中),它计算单个文件的MD5和SHA256哈希值。它对大文件非常有效。作为使用hashlib的示例,您可能会发现它很有用。

Simultaneously calculate multiple digests (md5, sha256)