python - 搜索并打印具有相同 MD5 的文件

标签 python function sorting md5 os.walk

我正在编写一个 Python 脚本来搜索文件夹(作为命令行参数传递)以查找具有相同 MD5 校验和(意味着这些文件相等)的文件并将它们打印在屏幕上。

我用过 os.walk()扫描文件夹的函数,写了一个计算MD5和的函数。但是现在我不知道如何搜索具有相同 MD5 校验和的文件。你能帮我解决这个问题吗?

#/usr/bin/env python3
import sys
import hashlib
import os
import operator
###############################################
def md5checksum (filepath):
    with open(filepath, "rb") as afile:
        m=hashlib.md5()
        data = afile.read()
        m.update(data)
        return m.hexdigest()
################################################
if __name__=="__main__":
    dir1 = sys.argv[1]
    info={}
    stampa=[]
    for path, dirname, filenames in os.walk(dir1):
        for filename in filenames:
            info[str(path)+filename]=md5checksum(str(path)+'/'+filename)

现在我想搜索并打印具有相同 MD5 校验和的元素。

最佳答案

你快到了。关键是你必须反转字典的结构:为了方便地搜索具有相同校验和的文件,你可以使用 MD5 和作为,以及一个列表具有该校验和作为值的路径:

{'6d4840fa80a877c234895ba45229d939': ['./search.py'],
 '7dac6bd007fce17b0325a693fdb62c68': ['./foo/foo1/f.txt', './foo/foo1/f2.txt'],
 'e7b39e258d9b15300d1732bfce9d89bd': ['./foo/foo1/f3.txt']}

然后检查简单地归结为:特定的校验和在其路径列表中是否有多个条目?如果是,则这些文件具有相同的校验和。

在此代码中,我使用了 defaultdict默认为一个列表,以避免必须检查校验和是否已经在字典中。

#!/usr/bin/env python3
from collections import defaultdict
import hashlib
import os
import sys


def md5checksum(filepath):
    with open(filepath, "rb") as afile:
        m = hashlib.md5()
        data = afile.read()
        m.update(data)
    return m.hexdigest()


def calculate_checksums(search_dir):
    checksums = defaultdict(list)

    for root, dirs, files in os.walk(search_dir):
        for filename in files:
            path = os.path.join(root, filename)
            checksum = md5checksum(path)
            checksums[checksum].append(path)
    return checksums


def display_equal_files(checksums):
    for checksum, paths in checksums.items():
        if len(paths) > 1:
            print("MD5 sum: {}".format(checksum))
            for path in paths:
                print("    {}".format(path))


if __name__ == "__main__":
    search_dir = sys.argv[1]
    checksums = calculate_checksums(search_dir)
    display_equal_files(checksums)

示例输出:

MD5 sum: 8863775ebac6399b538c852e5ee03559
    ./bar/bar.txt
    ./baz/bar2.txt
MD5 sum: 7dac6bd007fce17b0325a693fdb62c68
    ./foo/foo1/f.txt
    ./foo/foo1/f2.txt

一些注意事项:

  • 你的 shebang 是错误的。它应该以 #!/ 开头,而不是 #/
  • md5checksums() 函数中的缩进错误。缩进在 Python 中非常重要,一定要密切注意它。
  • 使用os.path.join加入文件路径。
  • 尝试关注 PEP8 style guide ,它使您的代码更具可读性

关于python - 搜索并打印具有相同 MD5 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717009/

相关文章:

python - 如何用特定集合中的元素填充 python 中的列表?

python - Seaborn - 根据 x 名称而不是色调更改条形颜色?

python - 无法登录有请求的网站

jquery - 在表中使用两个函数

c++ - 无效使用功能错误

python - 根据 Pandas 中的单元格值索引列

jquery函数插件,返回值类似于ajax中的$.get

c# - 根据另一个列表或不同大小对列表进行排序

sorting - 快速排序是一种分而治之的方法吗?

javascript - 从包含日期的数组中获取过去 30 天