如何使用哈希来比较两个目录中的许多文件并找到相同的?

问题描述 投票:0回答:2

我有一个数据集,正在从在线驱动器迁移到现场驱动器。我也在进行数据管理,因此我正在重新组织和重命名文件以适应我们的新标准(此时不编辑任何数据)。这是所有 GIS 数据,人们在此驱动器和工作计算机上的各种项目中引用了这些数据。移动或更新这些文件最终会破坏基本上所有文件的源代码,因此我需要找到一种方法来替换它们。

我已经弄清楚如何替换源文件路径,但这需要我知道新旧文件路径是什么。我能想到的唯一其他方法是手动复制旧的和新的,或者边走边匹配它们,这……并不理想。我见过很多关于比较单个文件的内容,但我一生都找不到任何关于比较两个文件文件夹或类似性质的内容。这可能已经在其他地方得到了回答,但我找不到它,所以如果您已经知道这里的答案,请指出我的答案。

附加信息:我们拥有的数据总量约为 150 GB,但可能有 1/3 不需要弄乱并且可以排除,因为其中的图像和积压的内容很可能永远不会再次使用和删除。

python python-3.x hash
2个回答
1
投票

如果您使用加密哈希,哈希将通过文件的内容唯一地标识文件。 您可以创建旧文件和新文件上文件路径的哈希字典,然后将它们匹配在一起以创建从旧文件到新文件的映射。

hashlib
模块中有很多不错的哈希算法选择。

import hashlib
import glob

old_files = dict()
for fn in glob.glob(old_path, recursive=True):
    with open(fn, 'rb') as f:
        hash = hashlib.md5(f.read())
        old_files[hash.digest()] = fn
new_files = dict()
for fn in glob.glob(new_path, recursive=True):
    with open(fn, 'rb') as f:
        hash = hashlib.md5(f.read())
        new_files[hash.digest()] = fn
mapping = { val: new_files[key] for key,val in old_files.items() if key in new_files }

0
投票

只需使用rsync。它会为您在两个目录之间同步所有文件。

rsync 通常用于远程复制,但您也可以将其用于本地复制。

或者,如果您需要经常执行此操作,只需将所有文件签入 Git,然后复制到另一台计算机或另一个目录只需 git pull/push。您可以在没有 Git 服务器的情况下执行此操作,因为 Git 是分布式 VCS。 Git 可以检测重命名和具有重复内容的文件,因此这种操作会非常快。

© www.soinside.com 2019 - 2024. All rights reserved.