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

ディレクトリの md5 チェックサムを計算するにはどうすればよいですか?

その場で tar アーカイブ ファイルを作成し、それを md5sum にパイプします。 :

tar c dir | md5sum

これにより、ファイルとサブディレクトリのセットアップに固有の単一の MD5 ハッシュ値が生成されます。ディスク上にファイルは作成されません。


空のディレクトリではなく、ファイルのみに関心がある場合、これはうまく機能します:

find /path -type f | sort -u | xargs cat | md5sum

tar c <dir> の使用に関する ire_and_curses の提案 いくつかの問題があります:

  • tar は、ファイル システムに格納されている順序でディレクトリ エントリを処理します。この順序を変更する方法はありません。これは、異なる場所に「同じ」ディレクトリがある場合、事実上まったく異なる結果をもたらす可能性があり、これを修正する方法はわかりません (tar は入力ファイルを特定の順序で「ソート」できません)。
  • 通常、groupid と ownerid の数値が同じかどうかを気にしますが、必ずしも group/owner の文字列表現が同じかどうかは気にしません。これは、たとえば rsync -a --delete と一致しています。 事実上すべて (xattrs と acl を除く) を同期しますが、文字列表現ではなく ID に基づいて所有者とグループを同期します。したがって、必ずしも同じユーザー/グループを持たない別のシステムに同期した場合は、--numeric-owner を追加する必要があります tar へのフラグ
  • tar には、チェックしているディレクトリのファイル名が含まれますが、注意が必要です。

最初の問題に対する修正がない限り (または、それがあなたに影響を与えないことが確実でない限り)、私はこのアプローチを使用しません.

提案された find

最後に、システム間で照合順序が異なる可能性があるため、推奨される解決策のほとんどは一貫して並べ替えられません。

これが私が思いついた解決策です:

dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum

このソリューションに関する注意:

  • LC_ALL=C システム全体で信頼性の高い並べ替え順序を確保することです
  • これは、"named\nwithanewline" というディレクトリと、"named" と "withanewline" という 2 つのディレクトリを区別しませんが、その可能性は非常に低いようです。通常、これは -print0 で修正されます find のフラグ 、しかし、ここでは他のことが起こっているので、コマンドを必要以上に複雑にする解決策しか見当たりません.

PS:私のシステムの 1 つは、限られたビジーボックス find を使用しています -exec をサポートしていない -print0 でもありません フラグ、およびディレクトリを示すために「/」を追加しますが、findutils find はそうではないようです。そのため、このマシンでは次を実行する必要があります:

dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum

幸いなことに、名前に改行が含まれるファイル/ディレクトリがないため、そのシステムでは問題になりません。


find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk '{print $1}' | sort | md5sum

発見 コマンドは、.py で終わるすべてのファイルを一覧表示します。MD5 ハッシュ値は、.py ファイルごとに計算されます。 AWK を使用して MD5 ハッシュ値を取得します (ファイル名は無視されるため、一意ではない可能性があります)。MD5 ハッシュ値はソートされます。次に、このソートされたリストの MD5 ハッシュ値が返されます。

テストディレクトリをコピーしてこれをテストしました:

rsync -a ~/pybin/ ~/pybin2/

~/pybin2 のいくつかのファイルの名前を変更しました .

find...md5sum コマンドは、両方のディレクトリに対して同じ出力を返します。

2bcf49a4d19ef9abd284311108d626f1  -

ファイル レイアウト (パス) を考慮して、ファイルの名前が変更または移動された場合にチェックサムが変更されるようにするには、コマンドを簡略化できます。

find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | md5sum

md5 の macOS の場合 :

find /path/to/dir/ -type f -name "*.py" -exec md5 {} + | md5

Linux
  1. find でディレクトリを除外する方法。指図

  2. ディレクトリ全体で dos2unix を実行するにはどうすればよいですか?

  3. 各ディレクトリ内のファイル数を数える方法は?

  1. ls コマンドからディレクトリを除外するにはどうすればよいですか

  2. システムで Hadoop hdfs ディレクトリを見つける方法は?

  3. 利用可能なネットワーク インターフェイスを見つけるにはどうすればよいですか?

  1. シェル - コマンドのディレクトリを見つける方法は?

  2. 各フォルダにファイルを作成するにはどうすればよいですか?

  3. 部分的なディレクトリ パスを見つける方法は?