コンテクスト:
さまざまな種類の大容量メディア ファイル、ISO イメージ ファイルなどが格納された大容量のテラバイト ドライブがあります。速度とパフォーマンスを考慮して、最初のメガバイトを使用してその内容を確認したいと思いますmd5sum
。
次のように合計を作成できます。
FILE=four_gig_file.iso
SUM=$(head -c 1M "$FILE" | md5sum)
printf "%s *%s\n" ${SUM%-} "$FILE" >>test.md5
最初のメガバイトの署名がファイル全体の署名と異なる場合、これをどのように検証しますか?
他の言語ではこれを見たことがありますが、バッシュmd5sum -c
パイプなどを使ったさまざまな組み合わせを試してみました。
を使用する代わりにmd5sum -c
、ハッシュを新しいファイルに再計算し、それらを「比較」する必要がありますか?
あなたは
find /directory/path/ -type f -print0 | xargs -0 md5sum blah blah
多数のファイルで作業します。
追伸:Rsyncは選択肢ではない
更新2: 現状では --
head、find、md5sum を使用すると、ソース ディレクトリからかなり迅速にファイルを作成し、宛先で計算した後、反対側で diff を使用してチェックすることができます。これを実行する賢いワンライナーやスクリプトはありますか?
答え1
ファイルの最初のメガバイトのみをサンプリングして内容を検証しても、大きなファイルの一部が何らかの形で破損、損傷、または変更されているかどうかは検出されない可能性があります。その理由は、ハッシュ アルゴリズムに渡すのは 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 にファイル全体を渡さない場合、ファイル名の文字列が渡されないためです。
答え2
少し変更されたソリューション/例です。find -size 引数を使用して 10 MB を超えるファイルのみを制限し、ファイルの最初の 1 MB と最後の 1 MB の部分から md5sum を計算します。
find . -type f -a -size +10M -print0 | xargs -0 -n1 -I{} sh -c 'echo "$( (head -c 1M '{}'; tail -c 1M '{}' ) | md5sum) {} "'