GNU/Linux >> Linux の 問題 >  >> Linux

ディレクトリのコンテンツのMd5合計を1つの合計として取得するにはどうすればよいですか?

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の回答のオプション。


Linux
  1. Imgファイルのタイプを見つけてマウントする方法は?

  2. 1行で最も古いファイルの年齢を検索しますか、それともゼロを返しますか?

  3. Python でファイルまたはディレクトリの所有者を見つける方法

  1. Pythonで(MB)ファイルのtar.gzのサイズを取得する方法

  2. bashでファイルの絶対ディレクトリを取得するにはどうすればよいですか?

  3. ファイルの行数だけを取得する方法

  1. ファイルの内容を再帰的に表示するには?

  2. ディレクトリツリーで最も古いファイルを見つけるにはどうすればよいですか

  3. 特定のプロセスの .pid ファイルを見つける方法