Execを使用すると、すべてのパラメータを一度に渡す{} +
か、次を使用して1つずつ渡すことができます。{} \;
それでは、すべての名前を変更したいとしましょう。JPEG、これを行うには問題はありません。
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec mv '{}' '{}'.new \;
ただし、出力をリダイレクトする必要がある場合は、'{}'
リダイレクト後にアクセスできません。
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec cjpeg -quality 80 '{}' > optimized_'{}' \;
これはうまくいきません。 forループを使用してfindを使用する前に、出力を変数に保存する必要があります。現実を直視すると、それは面倒なことです。
for f in `find . \( -name '*.jpg' -o -name '*.jpeg' \)`; do cjpeg -quality 80 $f > optimized_$f; done;
それでは、より良い方法がありますか?
ベストアンサー1
bash -c
コマンドで使用find -exec
し、bashコマンドで位置引数を使用できます。
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec bash -c 'cjpeg -quality 80 "$1" > "$(dirname "$1")/optimized_$(basename "$1")"' sh {} \;
{}
この方法が提供されます$1
。
sh
{}
ここで使用される文字列は、内部シェルに「名前」を通知する前のエラーメッセージに使用されます。これについては、以下でさらに詳しく説明します。stackoverflowに対するこの回答。