我想比较一些文件并找出哪些文件相同,但它们不一定是文本文件(所以请不要建议diff
)
文件可以是任何格式(即二进制文件)。
我发现我可以运行md5sum
查找每个文件的哈希值,然后手动进行比较以检查它们是否相同。但是我怎样才能自动化这个过程呢?
Ps:我还发现我可以使用将 md5sums 存储在一个文件中
md5sum <file-names> | cat >md5sum.txt
但我坚持如何自动化这个过程。
我希望通过脚本(语言无栏)来完成此操作。
我想比较一些文件并找出哪些文件相同,但它们不一定是文本文件(所以请不要建议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 命令行会溢出。