その場で 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