0

いくつかのファイルを比較して、どのファイルが同じかを調べたいのですが、必ずしもテキスト ファイルであるとは限りません (そのため、提案しないでくださいdiff) 。

ファイルは任意の形式 (つまり、バイナリ ファイル) にすることができます。

実行md5sumして各ファイルのハッシュを見つけ、手動で比較して同じかどうかを確認できることがわかりました。しかし、どうすればこのプロセスを自動化できますか?

Ps : md5sums を使用してファイルに保存できることもわかりました

md5sum <file-names> | cat >md5sum.txt

しかし、このプロセスを自動化する方法に行き詰まっています。

これはスクリプトを介して行うことをお勧めします(言語バーなし)。

4

1 に答える 1

3

ハッシュ/辞書の組み込みサポートを備えた 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])))

非常に多数のファイルを比較している場合、上記の例のようにコマンドラインでファイル名を指定するだけでは不十分な場合があることに注意してください。シェル コマンド ラインがオーバーフローします。

于 2011-10-19T13:22:06.437 に答える