ディレクトリ内のすべてのファイルに対してMD5sumを作成し、MD5SUMファイルを含むファイルごとに(ファイル名).md5を作成します。

ディレクトリ内のすべてのファイルに対してMD5sumを作成し、MD5SUMファイルを含むファイルごとに(ファイル名).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を使って次のコマンドを試しました。

find . -type f -exec md5sum {} + > {}.md5

xargsを使用して次のコマンドを試しました。

find . -type f | xargs -I {} md5sum {} > {}.md5

どちらの場合も、最終的に私が望むものではない{}.txtというファイルが生成されます。

私が作成したいmd5ファイルを生成するためにこれを調整する方法を教えてくれる人はいますか?

答え1

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

答え2

リダイレクトはシェルの演算子です。

存在する:

find some args  > {}.md5

find一部のパラメータを使用して実行すると、標準出力がにリダイレクトされます{}.md5

findここでファイルごとのリダイレクトを実行するには、シェルを起動する必要があります。

find . -type f -exec sh -c '
  for file do
    md5sum "$file" > "$file.md5"
  done' sh {} +

そのセクションでディレクトリコンポーネントを回避するには、多くの実装でサポートされている代替方法を.md5使用できます(一部の実装では依然としてディレクトリコンポーネントを取得し、一部の場合は実行ごとにディレクトリコンポーネントを取得できます)。ファイル:-execdirfind./{} +

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

単に合計を確認するには、次のscippletを使用します。

find . -type f ! -name \*.md5 |\
  while read a; do echo $a; md5sum -c $a.md5; done

答え4

cd /path/to/files && ls -1| xargs md5sum |  xargs -l bash -c 'echo $0"  "$1 > $1.md5'

最初の xargs が生成され、2 番目の xargs が選択され、.md5 に保存されます。

ファイルパターンをフィルタリングする必要がある場合は、lsをfindに置き換えるか、その後にgrepを追加できます。

関連情報