La explicación del manual me parece find
un poco confusa.
¿Cuál es el significado de "pero la línea de comando se crea agregando cada archivo seleccionado al final; el número total de invocaciones del comando será mucho menor que el número de archivos coincidentes" ¿Por qué sucede esto?
A continuación se muestra el texto deman find
-comando ejecutivo {} +
Esta variante de la
-exec
acción ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se crea agregando cada nombre de archivo seleccionado al final; el número total de invocaciones del comando será mucho menor que el número de archivos coincidentes. La línea de comando está construida de manera muy similar a comoxargs
se construyen sus líneas de comando. Solo se permite una instancia de '{}' dentro del comando. El comando se ejecuta en el directorio de inicio.
Respuesta1
¿Cuál es el significado de "pero la línea de comando se crea agregando cada archivo seleccionado al final; el número total de invocaciones del comando será mucho menor que el número de archivos coincidentes" ¿Por qué sucede esto?
Creemos algunos archivos de muestra:
touch {1..5}.txt
Primero, ejecutemos un comando de búsqueda:
$ find . -exec echo my files are: {} +
my files are: . ./1.txt ./5.txt ./4.txt ./3.txt ./2.txt
Como puede ver, {}
se reemplaza con la lista de todos los archivos que find
se encontraron. En este ejemplo, tenemos seis archivos coincidentes pero echo
se ejecuta solo una vez.
Tenga en cuenta que los shells tienen un límite en la cantidad de caracteres que aceptarán en una sola línea de comando. find
lo sabe y, si hay demasiados archivos para colocar en una línea de comando, find
se ejecutará echo
varias veces con diferentes archivos hasta que se hayan procesado todos los nombres de los archivos. Es por eso que "la cantidad de invocaciones del comando será mucho menor que la cantidad de archivos coincidentes".
Probemos esto creando muchos archivos en nuestro directorio:
touch this_is_a_long_file_name{1..10000}.txt
Ahora, ejecutemos un comando de búsqueda:
$ find . -exec bash -c 'echo $# files on this command line' _ {} +
3756 files on this command line
3754 files on this command line
2491 files on this command line
Como puede ver, aunque este directorio tenía más de 10.000 archivos, el comando exec sólo se ejecutó tres veces.