La sintaxis es:
find ... -exec cmd {} +
find
encontrará una cantidad de archivos basados en los criterios ...
y se ejecutará cmd
con esa lista de rutas de archivo como argumentos, tantos como sea posible sin superar el límite del tamaño de los argumentos de un comando.
Si es necesario, puede dividir la lista de archivos y llamar cmd
varias veces. Por ejemplo, puede terminar llamando:
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
Una limitación con eso es que {}
tiene que ser la última. No puedes por ejemplo escribir:
find ... -exec cmd {} other args +
como podrías con en ';'
lugar de '+'
.
Puedes escribir:
find ... -exec echo foo {} +
pero no:
find ... -exec echo {} foo +
Entonces, si necesita agregar algunos argumentos adicionales cmd
después de la lista de archivos, debe recurrir a llamar a un shell. (Otras razones por las que necesitaría llamar a un shell serían cada vez que necesite usar una función de shell como redirecciones, tuberías, algunas expansiones de cadenas ...)
En sh -c 'inline-script' x a b c
, para inline-script
, $0
es x
, $1
es a
, $2
es b
... también lo "$@"
es la lista de esos 3 argumentos: a, by c. Entonces en:
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
Para la secuencia de comandos en línea , $0
(que se utiliza, por ejemplo, cuando se muestran mensajes de error) se establece en find-sh
y "$@"
es la lista de archivos (a lo que se find
expande {}
).
Mediante el uso de la exec
construcción especial de la carcasa:
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
Le decimos al shell que no bifurque un proceso adicional para ejecutar cmd
, sino que lo ejecute en el mismo proceso (reemplazando el proceso de ejecución del shell con ese comando). A algunos shells les gusta bash
, zsh
y algunas implementaciones de ksh
hacer eso implícitamente para el último comando en un script.
-exec sh -c '(cmd1; cmd2;)' find-sh {} +
?