web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルのMD5sumを生成し、そのファイルのMD5SUMを含む各ファイルに(filename).md5を書き込みます

ファイルでいっぱいのディレクトリがあります。各ファイルは、特定のタイプの宛先ホストにコピーされます。

ディレクトリ内の各ファイルの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ファイルを生成するためにこれらを微調整する方法を誰かが指摘できますか?

2
Matthew
cd /path/to/files &&
for file in *; do
    if [[ -f "$file" ]]; then
        md5sum -- "$file" > "${file}.md5"
    fi
done
2
DopeGhoti

リダイレクトはシェルのオペレーターです。

に:

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 {} +
3

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
0
Stefan