¿Cuál es el uso de -exec xargs y -print0?

20

Creo que estas son las formas comunes de pasar el resultado de un comando al siguiente, como entradas.

¿Cómo funcionan estos tres? ¿O cuáles son algunos sitios web / URL?

James Bond
fuente

Respuestas:

25

Primeras cosas para escribir:

man find

man xargs

El findcomando imprime los resultados a la salida estándar de forma predeterminada, por lo que la -printopción normalmente no es necesaria, pero -print0separa los nombres de archivo con un byte 0 (NULL) para que los nombres que contienen espacios o líneas nuevas se puedan interpretar correctamente.

La -execopción es algo que puede usar en lugar de xargs: el comando find ejecuta un comando para cada elemento que encuentra.

El xargscomando lee cadenas separadas por espacios o líneas nuevas (generalmente del comando find , pero podrían provenir de cualquier lugar) y ejecuta algún comando para cada cadena.
Si xargs se ejecuta con una opción -0 , esperará cadenas separadas por NULL como resultado defind ... -print0

La ventaja de xargs es que puede agrupar las cadenas juntas, de modo que solo ejecuta un comando una o dos veces en lugar de n veces.

Entonces, en el uso normal:

find start_directory -name '*.txt' | xargs ls -l 

find enumeraría los nombres de archivo y xargs emitiría comandos como:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

que es más rápido que tener tu comando find emitiendo:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt
njd
fuente
7

Tenga en cuenta que xargs ya no es necesario con las implementaciones de búsqueda actuales que probablemente admitan esta sintaxis POSIX:

find directory -name '*.txt' -exec ls -l {} + 

que es más simple y un poco más rápido que la variante xargs.

find directory -name '*.txt' | xargs ls -l 
jlliagre
fuente
xargs usa muchos menos recursos que 'find -exec'
Felipe Alvarez
77
Eso es al revés. La canalización a xargs utilizará un poco más de recursos que -exec. Probablemente pase por alto el terminador "+".
jlliagre