linux - 比较 n 个文件(二进制)

标签 linux scripting hash md5 file-comparison

我想比较多个文件并找出哪些文件相同,但它们不一定是文本文件(所以请不要建议diff)

文件可以是任何格式(即二进制文件)。

我发现我可以运行 md5sum 来找到每个文件的哈希值,然后手动比较它以检查它们是否相同。但是我怎样才能使这个过程自动化呢?

Ps:我还发现我可以使用

将 md5sums 存储在文件中
md5sum <file-names> | cat >md5sum.txt

但我对如何使这个过程自动化感到困惑。

我希望通过脚本(语言无限制)来完成此操作。

最佳答案

如果您可以使用 perl 或 python 等内置哈希/字典支持的语言,那真的很容易。

遍历文件名和签名并创建一个以 md5sum 为键的散列和以该 md5 为值的文件列表。

然后遍历散列的内容并显示包含多个项目的条目。这些文件可能完全相同(使用基于签名的方法无法确定)。

当人们要求代码时,可能会像下面这样。那是一个 perl 实现。如果需要,我稍后可能会添加等效的 Python 示例。

#!perl
my $same = {};
for my $x (@ARGV){
    my ($sig, $name) = split(/\s+/, `md5sum $x`);
    if (!defined($same{$sig})){$same{$sig} = []}
    push @{$same{$sig}}, $name;
}

for my $sig (keys %same){
    if (@{$same{$sig}} > 1){
        print "Files with same MD5 : ".join('-', @{$same{$sig}})."\n";
    }
}

假设你把它放在一个文件 same.pl 中,你可以这样调用它:

perl 相同.pl

使用示例:

$ md5sum F*
c9904273735f3141c1dd61533e02246a  F1
c9904273735f3141c1dd61533e02246a  F2
c9904273735f3141c1dd61533e02246a  F3
d41d8cd98f00b204e9800998ecf8427e  F4

$ perl same.pl F1 F2 F3 F4
Files with same MD5 : F1-F2-F3

下面是一个可能的 python 版本(同时使用 python2 和 python3)。

#!python

import hashlib

def md5sum(filename):
    f = open(filename, mode='rb')
    buf = f.read(128)
    d = hashlib.md5(buf)
    while len(buf) == 128:
        buf = f.read(128)
        d.update(buf)
    return d.hexdigest()


if __name__ == "__main__":
    import sys
    same = {}
    for name in sys.argv[1:]:
        sig = md5sum(name)
        same.setdefault(sig, []).append(name)

    for k in same:
        if len(same[k]) > 1:
            print("Files with same MD5: {l}".format(l="-".join(same[k])))

请注意,如果您比较的文件数量非常大,那么在命令行中提供文件名可能是不够的,您应该使用一些更精细的方法来做到这一点(或者在脚本中放置一些 glob) , 否则 shell 命令行将溢出。

关于linux - 比较 n 个文件(二进制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7821829/

相关文章:

Linux "find"返回所有文件

c++ - 如何将彩色文本输出到 Linux 终端?

vim - 在 Vim 中编写常见任务的脚本

Python __hash__ : identity vs. 等价

swift - 枚举作为字典的键

Perl:哈希键中的常量值

linux - 在 debian 7 上安装 libssl0.9.8

linux - RT 的 var 中的 session_data 文件夹是什么?

powershell - 使用 Powershell Out-Host 时保留颜色

python - 在Python上使用套接字进行通信