web-dev-qa-db-ja.com

大きなファイルのmd5sum

環境:

さまざまな種類の大きなメディアファイル、ISOイメージファイルなどを備えた大きなテラバイトのドライブを持っています。速度/パフォーマンスのため、最初のメガバイトでmd5sumを使用してその内容を確認したいと思います。

次のような合計を作成できます。

FILE=four_gig_file.iso
SUM=$(head -c 1M "$FILE" | md5sum)
printf "%s *%s\n" ${SUM%-} "$FILE" >>test.md5

最初のメガバイトの署名がファイル全体の署名とは異なるため、これをどのように確認しますか?

これが他の言語で行われているのを見たことがありますが、 Bash でどのように行うのか疑問に思っています。私はパイプなどを含むさまざまなmd5sum -c順列を実験しました。


md5sum -cを使用する代わりに、ハッシュを新しいファイルに再計算してから、それらを「差分」する必要がありますか?

あなたは使用することができます

find /directory/path/ -type f -print0 | xargs -0 md5sum blah blah

多数のファイルを処理します。

PS:Rsyncはオプションではありません

更新2:現状では-

Head、find、およびmd5sumを使用します。次に、ソースディレクトリからかなり迅速にファイルを作成し、宛先で計算した後、反対側のdiffでファイルを確認できます。このための賢いワンライナーやスクリプトはありますか?

7
Bubnoff

ファイルの最初のメガバイトをサンプリングするだけでコンテンツを検証する場合、大きなファイルの一部が何らかの方法で破損、損傷、または変更されているかどうかを検出できない可能性があります。その理由は、他に何百メガバイトもオフになっている可能性がある場合に、ハッシュアルゴリズムに1メガバイトのデータのみを与えるためです。間違った位置にある1ビットでも、異なる署名が与えられます。

データの整合性を検証したい場合は、CRC32アルゴリズムを使用することをお勧めします。 MD5よりも高速です。正しいCRC32署名を持っているように見えるようにファイルを偽造/変更することは可能ですが、ランダムな破損がそれを行う可能性はほとんどありません。

更新:

これは、すべてのファイルに対して1メガバイトベースのmd5チェックサムを実行するための優れたワンライナーです。

find ./ -type f -print0 | xargs -0 -n1 -I{} sh -c "echo '{}' >> output.md5 && head -c 1M '{}' | md5sum >> output.md5"

必要に応じて、md5sumをcksumに置き換えます。出力にファイル名を含めることを選択したことに注意してください。これは、md5sumにファイル全体を指定しないと、ファイル名文字列が渡されないためです。

7
jesper