O Exec nos permite passar todos os argumentos de uma só vez {} +ou passá-los um por um com{} \;
Agora, digamos que eu queira renomear todos os jpeg , não há problema em fazer isso:
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec mv '{}' '{}'.new \;
Mas se eu precisar redirecionar a saída, '{}'não estará acessível após o redirecionamento.
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec cjpeg -quality 80 '{}' > optimized_'{}' \;
Isso não funcionaria. Eu precisaria usar um loop for, armazenando a saída do find em uma variável antes de usá-la. Vamos admitir, é complicado.
for f in `find . \( -name '*.jpg' -o -name '*.jpeg' \)`; do cjpeg -quality 80 $f > optimized_$f; done;
Então, existe uma maneira melhor?
{}aparecem em cadeias mais longas, pois essas cadeias geralmente não são expandidas.
find, uma vez, e aplicado ao findpróprio comando. O {}não tem significado especial nesse contexto. O redirecionamento não é um argumento finde certamente não faz parte da -execcláusula.
>falta no terceiro exemplo de código?