Introducción
La xargs
permite crear y ejecutar comandos desde la entrada estándar.
xargs
generalmente se usa junto con otros comandos canalizados. Con xargs
puede proporcionar entrada estándar como argumentos para utilidades de línea de comando como mkdir
y rm
.
En este tutorial, cubriremos los conceptos básicos del uso del comando xargs
Cómo utilizar el comando Xargs
xargs
lee los argumentos de la entrada estándar, separados por espacios en blanco o líneas nuevas, y ejecuta el comando especificado utilizando la entrada como argumentos de comando. Si no se da ningún comando, el valor predeterminado es /bin/echo
.
La sintaxis del xargs
es la siguiente:
xargs [OPTIONS] [COMMAND [initial-arguments]]
El ejemplo más básico de usar el xargs
sería pasar varias cadenas separadas por espacios en blanco usando una tubería y ejecutar un comando que usará esas cadenas como argumentos.
echo "file1 file2 file3" | xargs touch
En el ejemplo anterior, estamos canalizando la entrada estándar a xargs
y el touch
se ejecuta para cada argumento, creando tres archivos. Es lo mismo que si hubieras corrido:
touch file1 file2 file3
Mostrar el comando
Para imprimir el comando en la terminal antes de ejecutarlo, use la -t
( --verbose
):
echo "file1 file2 file3" | xargs -t touch
touch file1 file2 file3
Si desea que se le pregunte si debe ejecutar cada comando antes de ejecutarlo, use la -p
( --interactive
):
echo "file1 file2 file3" | xargs -p touch
Escriba y
Y
para confirmar y ejecutar el comando:
touch file1 file2 file3 ?...y
Esta opción es útil al ejecutar comandos destructivos.
Cómo limitar el número de argumentos
De forma predeterminada, el número de argumentos que se pasan al comando está determinado por el límite del sistema.
La -n
( --max-args
) especifica el número de argumentos para pasar al comando dado. xargs
ejecutará el comando especificado tantas veces como sea necesario hasta que se agoten todos los argumentos.
En el siguiente ejemplo, el número de argumentos leídos de la entrada estándar está limitado a 1.
echo "file1 file2 file3" | xargs -n 1 -t touch
Como puede ver en el resultado detallado a continuación, el comando táctil se ejecuta por separado para cada argumento:
touch file1
touch file2
touch file3
Cómo ejecutar varios comandos
Para ejecutar varios comandos con xargs
, use la opción -I
Funciona definiendo un replace-str
después de -I
y luego todas las apariciones de replace-str
se reemplazan con el argumento pasado a xargs
.
El xargs
ejemplo de xargs ejecutará dos comandos, primero creará los archivos usando touch
y luego listará los archivos con el comando ls
echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file1
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file2
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file3
Una opción común para replace-str
es %
, sin embargo, puede usar otro marcador de posición como ARGS
:
echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }'
Cómo especificar un delimitador
Utilice la -d
( --delimiter
) para establecer un delimitador personalizado que puede ser un solo carácter o una secuencia de escape que comience con \
.
En el siguiente ejemplo usamos ;
como delimitador:
echo "file1;file2;file3" | xargs -d \; -t touch
touch file1 file2 file3
Cómo leer elementos del archivo
El xargs
también puede leer elementos de un archivo en lugar de la entrada estándar. Para hacer esto, use la -a
( --arg-file
) seguida del nombre del archivo.
En el siguiente ejemplo, el xargs
comando leerá el ips.txt
archivo y ping a cada dirección IP.
8.8.8.8
1.1.1.1
También estamos usando la -L 1
que le dice al xargs
que lea una línea a la vez. Si se omite esta opción, todas las direcciones IP cambiarán a un solo comando ping
xargs -t -L 1 -a ips.txt ping -c 1
ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=68.1 ms...
ping -c 1 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=21.4 ms
Usando xargs con encontrar
xargs
se usa a menudo junto con el comando de find
Puede usar find
para buscar archivos específicos y luego usar xargs
para realizar operaciones en esos archivos.
Para evitar problemas con nombres de archivo que contienen líneas nuevas u otros caracteres especiales, siempre use la -print0
que hará que find imprima el nombre de archivo completo seguido de un carácter nulo. Esta salida se puede interpretar correctamente con xargs
usando la -0
, ( --null
).
En el siguiente ejemplo, find
imprimirá los nombres completos de todos los archivos dentro del directorio /var/www/.cache
xargs
pasará las rutas de los archivos al comando rm
find /var/www/.cache -type f -print0 | xargs -0 rm -f
Utilice xargs para recortar los espacios
xargs
también se puede utilizar como herramienta para eliminar espacios en blanco de ambos lados de una cadena determinada. Simplemente redirija la cadena al xargs
y hará el corte:
echo " Long line " | xargs
Long line
Esto puede resultar útil al comparar cadenas en scripts de shell.
#!/bin/bash
VAR1=" Noviello "
VAR2="Noviello"
if [[ "$VAR1" == "$VAR2" ]]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
## Using xargs to trim VAR1
if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
Strings are not equal.
Strings are equal.
Conclusión
A estas alturas, debería tener un buen conocimiento de cómo usar el xargs
Linux. Para obtener información más detallada sobre las xargs
, escriba el siguiente comando:
manx xargs