ejemplos unix xargs

unix - ejemplos - xargs rm



Comprender el comando UNIX xargs (5)

Estoy bastante confundido sobre esto. Necesita algunas aclaraciones

Ejemplo 1 :

pgrep string | xargs ps

Ejemplo 2:

find . | xargs grep whatever

Del Ejemplo 1, entiendo que es de esta manera:

Busque una "cadena" que es parte del nombre del proceso en ejecución y devuelva los id. De proceso de todas las coincidencias a ''xargs ps'' -> que simplemente agrega ps a las coincidencias (que son ids de proceso) para obtener el mismo salida como:

ps <processid>

¿Alguien puede explicar lo que Xargs realmente hace en este caso?

Desde el Ejemplo 2, entiendo que es de esta manera:

Es buscar alguna "cadena" recursivamente desde el directorio de trabajo actual. Aquí, ¿cómo funciona exactamente ''xargs''?

Yo era de la opinión de que ''xargs'' agrega datos de la entrada estándar al ''argumento'' dado a xargs (que generalmente es un comando de UNIX por sí mismo).

De la página man de xargs ():

xargs lee elementos de la entrada estándar, delimitados por espacios en blanco (que se pueden proteger con comillas dobles o simples o una barra invertida) o líneas nuevas, y ejecuta el comando (predeterminado es / bin / echo) una o más veces con cualquier argumento inicial seguido por elementos leídos de la entrada estándar. Las líneas en blanco en la entrada estándar son ignoradas.


Un buen ejemplo de lo que hace xargs es intentar obtener sumas de comprobación ordenadas para cada archivo en un directorio usando find.

find . | cksum | sort

devuelve solo una suma de comprobación, y no está claro para qué es la suma de comprobación. No es lo que queremos La tubería envía el stdout de find en stdin para cksum. Lo que cksum realmente quiere es una lista de líneas de comando args, por ejemplo

cksum file001.blah file002.blah file003.blah

informará tres líneas, una por archivo, con las sumas de comprobación deseadas. Xargs hace el truco de magia: convierte la salida estándar del programa anterior en una línea de comando temporal y oculta para pasar a la siguiente. La línea de comando que funciona es:

find . | xargs cksum | sort

Tenga en cuenta que no hay tubería entre xargs y cksum.


xargs se usa normalmente para agrupar argumentos para que no se obtenga un error de "demasiados argumentos" que ocurre cuando pasa una gran cantidad de argumentos a un comando


#!/bin/sh #script to echo out the arguments 1 at a time! for a in $* do echo $a done

El comando

$sh myscript 1 2 3 4 5

rendirá

1 2 3 4 5

pero

$sh myscript 1 2 3 4 5 6 7 8 9 10 11

no funcionará ya que se excede el número máximo de parámetros (¡no estoy seguro de cuál es el máximo, pero digamos que es 10 para este ejemplo!)

Para evitar esto, podríamos usar

#!/bin/sh #script to echo out the arguments 1 at a time! for a in $* do echo $a | xargs echo done

entonces podríamos ejecutarlo así

$sh myscript "1 2 3 4 5" "6 7 8 9 10 11"

y obtenga el resultado correcto ya que solo hay 2 parámetros


$ echo ''line1 > line2 > line3 > ... > lineN '' | xargs cmd1 -a -b

resultará en:

$ cmd1 -a -b line1 line2 line3 ... lineN

cmd1 ... romperá cmd1 ... en varias ejecuciones de cmd1 si el recuento de líneas es demasiado grande.

xargs se puede usar para muchas otras tareas relacionadas con pasar líneas stdin como argumentos posicionales. Eche un vistazo a la opción capital -P en xargs (1) para ejecutar varias instancias de un comando en paralelo.


En general, xargs se usa así

Prog | utilidad xargs

donde se espera que prog genere uno o más resultados separados de nueva línea / espacio. ¡El truco es que xargs no! Nessarly llama a la utilidad una vez por cada resultado, en su lugar divide la lista de resultados en sublistas y utilidad de llamadas para cada sublista. Si desea obligar a xargs a llamar a la utilidad para cada resultado individual, deberá invocarlo con xargs -L1 .

Tenga en cuenta que xargs le promete que la sublista enviada a la utilidad es más corta que ARG_MAX (así es como evita las temidas listas de Argumentos en los errores largos ). Puede obtener el valor actual de ARG_MAX usando getconf ARG_MAX