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;
より良い方法はありますか?
{}このような文字列は通常は展開されないため、長い文字列に現れるコマンドラインは避けてください。
find一度起動したシェルによって処理され、findコマンド自体に適用されるためです。{}その文脈では特別な意味を持ちません。リダイレクションはへの議論ではありませんfind、そしてそれは確かに-exec条項の一部ではありません。
>3番目のコードサンプルに欠落はありませんか?