Exec nos permite pasar todos los argumentos a la vez con {} +o pasarlos uno por uno con{} \;
Ahora digamos que quiero cambiar el nombre de todos los archivos JPEG , no hay problema para hacer esto:
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec mv '{}' '{}'.new \;
Pero si necesito redirigir la salida, '{}'no es accesible después de la redirección.
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec cjpeg -quality 80 '{}' > optimized_'{}' \;
Esto no funcionaria. Tendría que usar un bucle for, almacenar el resultado de find en una variable antes de usarlo. Admitámoslo, es engorroso.
for f in `find . \( -name '*.jpg' -o -name '*.jpeg' \)`; do cjpeg -quality 80 $f > optimized_$f; done;
Entonces, ¿hay una mejor manera?
{}aparece en cadenas más largas, ya que estas cadenas no suelen expandirse.
find, una vez, y aplicada al findcomando en sí. El {}no tiene un significado especial en ese contexto. La redirección no es un argumento para find, y ciertamente no es parte de la -execcláusula.
>falta en el tercer ejemplo de código?