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番目のコードサンプルに欠落はありませんか?