Cómo crear y ejecutar comandos desde la entrada estándar en Linux (Xargs)

27 feb 2021 4 min di lettura
Cómo crear y ejecutar comandos desde la entrada estándar en Linux (Xargs)
Indice dei contenuti

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

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.