ファイルでいっぱいのディレクトリがあります。各ファイルは、特定のタイプの宛先ホストにコピーされます。
ディレクトリ内の各ファイルのMD5合計を計算し、そのmd5合計を、合計を生成したファイルの名前と一致するファイルに保存しますが、.md5を追加します。
したがって、たとえば、次のディレクトリがあるとします。
a.bin
b.bin
c.bin
最終結果は次のようになります。
a.bin
a.bin.md5 # a.bin's calculated checksum
b.bin
b.bin.md5 # b.bin's calculated checksum
c.bin
c.bin.md5 # c.bin's calculated checksum
私はこれをfind execとxargsで試しました。
検索で、私はこのコマンドを試しました:
find . -type f -exec md5sum {} + > {}.md5
Xargsを使用して、次のコマンドを試しました。
find . -type f | xargs -I {} md5sum {} > {}.md5
どちらの場合も、最終的に{} .txtというファイルが作成されますが、これは実際に探しているものではありません。
私が生成しようとしているmd5ファイルを生成するためにこれらを微調整する方法を誰かが指摘できますか?
cd /path/to/files &&
for file in *; do
if [[ -f "$file" ]]; then
md5sum -- "$file" > "${file}.md5"
fi
done
リダイレクトはシェルのオペレーターです。
に:
find some args > {}.md5
find
はいくつかの引数を指定して実行され、その標準出力は{}.md5
にリダイレクトされます。
ここでは、シェルごとにファイルごとに1つのリダイレクトを実行するためにfind
が必要です。
find . -type f -exec sh -c '
for file do
md5sum "$file" > "$file.md5"
done' sh {} +
.md5
部分のディレクトリコンポーネントを避けたい場合は、多くのfind
実装でサポートされている-execdir
代替手段を使用できます(ただし、一部は./
ディレクトリコンポーネントと一部のコンポーネントでは、{} +
を使用しても、ファイルごとに1つのシェルが実行されます。
find . -type f -execdir sh -c '
for file do
md5sum "$file" > "$file.md5"
done' sh {} +
または、次のように実行できます。
find . -type f -exec sh -c '
for file do
(cd "${file%/*" && exec md5sum -- "${file##*/}") > "$file.md5"
done' sh {} +
Whileループへのパイピングには副作用があることは知っていますが、このソリューションのシンプルさ、読みやすさ、拡張性が好きです
find . -type f ! -name \*.md5 |\
while read a; do md5sum $a > $a.md5; done
このスクリプトレットを使用して合計を簡単にチェックするには:
find . -type f ! -name \*.md5 |\
while read a; do echo $a; md5sum -c $a.md5; done