>以降は利用できないexec '{}'を探す

>以降は利用できないexec '{}'を探す

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に対するこの回答

おすすめ記事