md5sumプログラムは、ディレクトリのチェックサムを提供しません。サブディレクトリ内のファイルを含む、ディレクトリのコンテンツ全体に対して単一のMD5チェックサムを取得したいと思います。つまり、すべてのファイルから作成された1つの結合されたチェックサムです。これを行う方法はありますか?
承認された回答:
正しい方法は、質問する理由によって異なります。
オプション1:データのみを比較する
ツリーのファイルの内容のハッシュが必要な場合は、これでうまくいきます:
$ find -s somedir -type f -exec md5sum {} ; | md5sum
これは、最初にすべてのファイルの内容を予測可能な順序で個別に要約し、次にそのファイル名のリストとMD5ハッシュを渡してハッシュし、ツリー内のファイルの1つの内容が変更された場合にのみ変更される単一の値を提供します。
残念ながら、find -s
macOS、FreeBSD、NetBSDおよびOpenBSDで使用されるBSD find(1)でのみ動作します。 GNUまたはSUSのfind(1)を備えたシステムで同等のものを取得するには、少し醜いものが必要です。
$ find somedir -type f -exec md5sum {} ; | sort -k 2 | md5sum
BSD find -s
の動作を模倣しました sort
への呼び出しを追加する 。 -k 2
ビットはMD5ハッシュをスキップするように指示するため、フィールド2から行末までのファイル名のみをsort
でソートします。 の計算。
このバージョンのコマンドには弱点があります。これは、sort
に対して複数行のように見えるため、改行を含むファイル名があると混乱する可能性があることです。 電話。 find -s
ツリーの走査と並べ替えは同じプログラム内で行われるため、バリアントにはその問題はありません。find
。
いずれの場合も、誤検知を回避するために並べ替えが必要です。最も一般的なUnix / Linuxファイルシステムは、ディレクトリリストを安定した予測可能な順序で維持しません。 ls
を使用してもこれに気付かない場合があります など、ディレクトリの内容をサイレントに並べ替えます。 find
を呼び出す なんらかの方法で出力を並べ替えないと、出力の行の順序が、基になるファイルシステムが返す順序と一致するようになります。これにより、入力として指定されたファイルの順序が変更された場合でも、このコマンドは変更されたハッシュ値を提供します。データが同一のままの場合。
-k 2
かどうかを尋ねるのもよいでしょう。 GNU sort
のビット 上記のコマンドが必要です。ファイルのデータのハッシュが内容が変更されていない限りファイル名の適切なプロキシであるとすると、このオプションを削除しても誤検知は発生せず、GNUとBSDの両方で同じコマンドを使用できますsort
。ただし、ファイル名の正確な順序が-k 2
を使用しない場合の半順序と一致しない可能性がわずかにあります(MD5では1:2)。 ハッシュ衝突が発生した場合に与えることができます。ただし、このような不一致の可能性がアプリケーションにとって重要である場合は、このアプローチ全体が問題外である可能性があることに注意してください。
md5sum
を変更する必要があるかもしれません md5
へのコマンド または他のハッシュ関数。別のハッシュ関数を選択し、システムのコマンドの2番目の形式が必要な場合は、sort
を調整する必要がある場合があります。 それに応じてコマンド。もう1つの落とし穴は、一部のデータ加算プログラムがファイル名をまったく書き出さないことです。その代表的な例は、古いUnixのsum
です。 プログラム。
このメソッドはやや非効率的で、md5sum
を呼び出します N + 1回。ここで、Nはツリー内のファイルの数ですが、ファイルとディレクトリのメタデータのハッシュを回避するために必要なコストです。
オプション2:データの比較と メタデータ
その何かを検出できるようにする必要がある場合 ファイルの内容だけでなく、ツリー内が変更された場合は、tar
に質問してください ディレクトリの内容をまとめて、md5sum
に送信します。 :
$ tar -cf - somedir | md5sum
tar
また、ファイルのアクセス許可や所有権なども表示されます。これにより、ファイルの内容の変更だけでなく、それらの変更も検出されます。
この方法は、ツリーを1回だけ通過し、ハッシュプログラムを1回だけ実行するため、かなり高速です。
find
と同様に 上記のベースの方法、tar
基になるファイルシステムがファイル名を返す順序でファイル名を処理します。アプリケーションでは、これが発生しないことを確認できる可能性があります。それが当てはまる可能性が高い、少なくとも3つの異なる使用パターンを考えることができます。 (不特定の動作領域に入っているため、これらをリストしません。各ファイルシステムは、OSのバージョンごとに、ここでは異なる可能性があります。)
誤検知が発生した場合は、find | cpio
Gillesの回答のオプション。