*.py
ディレクトリとすべてのサブディレクトリの下に配置された特定のタイプ(たとえば)のすべてのファイルの要約md5チェックサムを計算する必要があります。
それを行う最良の方法は何ですか?
編集:提案されたソリューションは非常に優れていますが、これは私が必要としているものとは正確には異なります。私は、ディレクトリ全体を一意に識別する単一の要約チェックサム(すべてのサブディレクトリのコンテンツを含む)を取得するソリューションを探しています。
*.py
ディレクトリとすべてのサブディレクトリの下に配置された特定のタイプ(たとえば)のすべてのファイルの要約md5チェックサムを計算する必要があります。
それを行う最良の方法は何ですか?
編集:提案されたソリューションは非常に優れていますが、これは私が必要としているものとは正確には異なります。私は、ディレクトリ全体を一意に識別する単一の要約チェックサム(すべてのサブディレクトリのコンテンツを含む)を取得するソリューションを探しています。
回答:
find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk '{print $1}' | sort | md5sum
findコマンドは、.pyで終わるすべてのファイルをリストします。md5sumは.pyファイルごとに計算されます。awkはmd5sumsを選択するために使用されます(一意でない可能性があるファイル名は無視されます)。md5sumがソートされます。次に、このソートされたリストのmd5sumが返されます。
私はテストディレクトリをコピーしてこれをテストしました:
rsync -a ~/pybin/ ~/pybin2/
〜/ pybin2にあるいくつかのファイルの名前を変更しました。
このfind...md5sum
コマンドは、両方のディレクトリに対して同じ出力を返します。
2bcf49a4d19ef9abd284311108d626f1 -
awk ...
シグネチャのレイアウト部分を検討する場合は、@ ValentinMileaがその部分を削除するだけです。
その場でtarアーカイブファイルを作成し、それをmd5sum
次の場所にパイプします。
tar c dir | md5sum
これにより、ファイルとサブディレクトリのセットアップに固有の単一のmd5sumが生成されます。ディスク上にファイルは作成されません。
ls -alR dir | md5sum
。これは、読み取りだけで圧縮しないほうがよいです。コンテンツはMODの時間とファイルのサイズが含まれているので、それはユニークです;)
z
gzipまたはj
bzip2 を追加する必要があります。どちらもしていません。
tar
同じファイルのセットを2回、または2台の異なるコンピューターで実行しても、まったく同じ結果が得られる保証はありません。
ire_and_cursesの使用tar c <dir>
に関する提案には、いくつかの問題があります。
rsync -a --delete
います。事実上すべて(xattrsとaclsを除く)を同期しますが、所有者とグループは文字列表現ではなくIDに基づいて同期します。したがって、必ずしも同じユーザー/グループを持たない別のシステムに同期した場合は、--numeric-owner
tarにフラグを追加する必要があります最初の問題が修正されていない限り(または、影響がないことが確実でない限り)、このアプローチは使用しません。
find
彼らは唯一のあなたがチェックサムは、心の中で空のディレクトリを維持する必要がある場合は問題になるファイルは、いないディレクトリが含まれるため、上記の提案に基づく解決策もダメではありません。
最後に、照合はシステム間で異なる可能性があるため、ほとんどの提案されたソリューションは一貫してソートされません。
これは私が思いついた解決策です:
dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum
このソリューションに関するメモ:
LC_ALL=C
システム間で信頼性のソート順序を確保することです-print0
フラグで修正find
しますが、ここでは他のことが行われているため、コマンドをより複雑にし、価値がある解決策しか見ることができません。PS:私のシステムの1つは、フラグもfind
サポートしていない限られたbusybox を使用しています。また、ディレクトリを示すために「/」を追加していますが、findutils findはそうではないため、このマシンでは実行する必要があります。-exec
-print0
dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum
幸い、名前に改行が含まれるファイルやディレクトリはありません。そのため、このシステムでは問題になりません。
完全を期すために、md5deep(1)があります。* .pyフィルター要件のため、直接適用することはできませんが、find(1)と一緒にうまく機能するはずです。
私にとって最も効果的な解決策:
find "$path" -type f -print0 | sort -z | xargs -r0 md5sum | md5sum
それが私にとって最もうまくいった理由:
他の回答に関する問題:
ファイルシステムのメタデータは無視されません:
tar c - "$path" | md5sum
スペースを含むファイル名を処理せず、ファイルの名前が変更されたかどうかも検出しません。
find /path -type f | sort -u | xargs cat | md5sum
コンテンツとファイル名の両方を含むすべてのファイルのチェックサム
grep -ar -e . /your/dir | md5sum | cut -c-32
上記と同じですが、*。pyファイルのみが含まれます
grep -ar -e . --include="*.py" /your/dir | md5sum | cut -c-32
必要に応じて、シンボリックリンクをたどることもできます
grep -aR -e . /your/dir | md5sum | cut -c-32
grepでの使用を検討できるその他のオプション
-s, --no-messages suppress error messages
-D, --devices=ACTION how to handle devices, FIFOs and sockets;
-Z, --null print 0 byte after FILE name
-U, --binary do not strip CR characters at EOL (MSDOS/Windows)
技術的には、を実行するだけで済みますls -lR *.py | md5sum
。誰かがファイルを変更して元の日付に戻し、ファイルのサイズを変更しないことを心配しない限り、からの出力ls
はファイルが変更されたかどうかを通知します。私のunix-fooは弱いので、印刷するための作成時間と変更時間を取得するには、さらにいくつかのコマンドラインパラメータが必要になる場合があります。ls
ファイルのアクセス許可が変更されているかどうかも通知されます(気にしない場合は、それをオフにするスイッチがあるはずです)。
touch
、ファイルの日付を変更する(内容は変更しない)場合、チェックサムは変更されないことが期待されます。
私は同じ問題を抱えていたので、ディレクトリ内のファイルのmd5sumを一覧表示するだけのこのスクリプトを思いつきました。サブディレクトリがそこから再度実行されると、スクリプトが現在のスクリプトを実行できるようになる必要があります。上記の引数が$ 1で渡される場合、ディレクトリまたはサブディレクトリから
#!/bin/bash
if [ -z "$1" ] ; then
# loop in current dir
ls | while read line; do
ecriv=`pwd`"/"$line
if [ -f $ecriv ] ; then
md5sum "$ecriv"
elif [ -d $ecriv ] ; then
sh myScript "$line" # call this script again
fi
done
else # if a directory is specified in argument $1
ls "$1" | while read line; do
ecriv=`pwd`"/$1/"$line
if [ -f $ecriv ] ; then
md5sum "$ecriv"
elif [ -d $ecriv ] ; then
sh myScript "$line"
fi
done
fi
ファイルシステムの属性や一部のtarバージョンのビットレベルの違いからの独立性が本当に必要な場合は、cpioを使用できます。
cpio -i -e theDirname | md5sum