ハッシュ/辞書の組み込みサポートを備えた 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 same.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])))
非常に多数のファイルを比較している場合、上記の例のようにコマンドラインでファイル名を指定するだけでは不十分な場合があることに注意してください。シェル コマンド ラインがオーバーフローします。