背景
既存のNASから新しいNASにファイルを移行しようとしており、データの整合性を確認したいと思います。以前のNAS(Debian)はLinux Ext3ファイルシステムを使用し、新しいNAS(FreeNAS)はZFSに基づいています。整合性検証を高速化するために分類方法を試しました。
- まず、すべてのファイルサイズを確認してください。
- 2番目に、md5は各ファイルの最初の512バイトをハッシュします。
- 最後に、md5はファイル全体をハッシュします。
アイデアは、最初の2つのステップが明らかに破損したファイルをフィルタリングし、テラバイトファイルで一括してmd5を実行するよりもはるかに高速に検索することです。
質問
私はディレクトリ構造のmd5ハッシュを実行し、ファイル名に基づいて出力をソートして、Linux NASで決定的な順序を保証するbashコマンドを作成しました。
#find somedir -type f -exec md5sum {} \; | sort -k 34;
12e761f96223145aa63f4f48f252d7fb /somedir/foo.txt
18409feb00b6519c891c751fe2541fdc /somedir/bar.txt
しかし、各ファイルの最初の512バイトのみをmd5にしたい場合は、上記の内容をどのように変更できますか?
答え1
最初のdd
512バイトをmd5sum
。md5sum
-
find . -type f -exec sh -c "dd if={} bs=512 count=1 2>/dev/null | md5sum | sed s\|-\|{}\|" \; | sort -k 34;
答え2
許可された答えは私には適していません。特殊文字を含むファイルの場合、内部的に{}
失敗しますexec
。そのため、代わりにGNUを使用しましたparallel
(次のソリューションが機能するように最新バージョンをインストールします)。
を使用すると、parallel
特殊{}
文字を含むファイルに対して誤った動作は発生しません。また、parallel
プロセスを複数のコアに分散させるため、プロセス全体が高速化されます。これが私のために働いたものですparallel
。
find . -type f | parallel 'dd if={} bs=512 count=1 2>/dev/null | md5sum | tr -d "\n"; echo {};' | sort -k34;