ファイルでいっぱいのディレクトリがあります。各ファイルは特定のタイプの宛先ホストにコピーされます。
ディレクトリ内のすべてのファイルの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
使用できます(一部の実装では依然としてディレクトリコンポーネントを取得し、一部の場合は実行ごとにディレクトリコンポーネントを取得できます)。ファイル:-execdir
find
./
{} +
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を追加できます。