¿Cómo se construye la línea de comando para find -exec comando {} +

¿Cómo se construye la línea de comando para find -exec comando {} +

La explicación del manual me parece findun 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 -execacció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 como xargsse 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 findse encontraron. En este ejemplo, tenemos seis archivos coincidentes pero echose 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. findlo sabe y, si hay demasiados archivos para colocar en una línea de comando, findse ejecutará echovarias 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.

información relacionada