¿Cómo usar el comando xargs en Linux para simplificar su trabajo?

0
9990

El comando xargs en Linux puede facilitar la creación y ejecución de comandos. Si desea ejecutar el mismo comando para un grupo de archivos o usuarios, xargs a menudo puede facilitar ese proceso.

Aquí hay un ejemplo muy simple del comando xargs  que crea o actualiza la fecha de algunos archivos.

$ echo file1 file2 file3 | xargs touch
$ ls -l
total 0
-rw-r--r--. 1 shs shs 0 Oct 15 12:41 file1
-rw-r--r--. 1 shs shs 0 Oct 15 12:41 file2
-rw-r--r--. 1 shs shs 0 Oct 15 12:41 file3

El siguiente comando es similar, pero crea un archivo con espacios en blanco en su nombre porque -d especifica el caracter de terminación de entrada.

$ echo 'my new file' | xargs -d '\n' touch
$ ls -l
total 0
-rw-r--r--. 1 shs shs 0 Oct 15 12:41  file1
-rw-r--r--. 1 shs shs 0 Oct 15 12:41  file2
-rw-r--r--. 1 shs shs 0 Oct 15 12:41  file3
-rw-r--r--. 1 shs shs 0 Oct 15 12:57 'my new file'

Por otro lado, los comandos como los que se muestran arriba crean archivos vacíos o actualizan la fecha/hora en los archivos, pero cada uno ejecuta un solo comando (es decir, “touch file1 file2 file3” y “touch ‘my new file’ “) eso es mucho más simple que el que se muestra.

Agregado al final de un comando que selecciona o encuentra archivos según algunos criterios, el uso de xargs puede ser considerablemente más útil. Aquí hay un ejemplo que cambia los permisos en todos los archivos png dentro del directorio de imágenes:

$ find images -name "*.png" -type f | xargs chmod 640

Para ver el comando que ejecuta xargs , agregue la opción -t :

$ echo file1 file2 file3 | xargs -t touch
touch file1 file2 file3          <== command that is run

$ find images -name "*.png" -type f | xargs -t chmod 640
chmod 640 images/Penguin_Simpson.png images/Penguin_joined-1.png images/Penguin_purple.png images/joined-1.png images/Penguin_10quality.png images/joined-0.png images/penguin.png images/Penguin_50quality.png images/penguin0.png images/appended.png images/45.png images/Penguin_flipped.png images/Penguin_blurred.png images/Mailing_label_2.png images/Penguin_Simpson_2.png images/Penguin_joined-0.png images/outfile.png images/Penguin_45.png images/penguin4.png images/Mailing_label.png images/arrow.png

En el siguiente ejemplo, usamos find para ubicar archivos que no se han actualizado en más de cuatro semanas y xargs para eliminarlos.

$ find . -mtime +28 | xargs rm

Este es un comando para buscar y eliminar archivos vacíos que comienzan en el directorio actual:

$ find . -size 0 | xargs rm

Hacer lo mismo cuando puede haber espacios en blanco en algunos de los nombres de archivo se puede hacer con un comando como este:

$ find . -size 0 | xargs -I{} rm -v {}
removed './empty'
removed './my empty file'

El comando xargs se usa con frecuencia con find para localizar y tratar archivos de acuerdo con muchos criterios diferentes, como la edad, el tipo de archivo y los permisos.

En el siguiente ejemplo, estamos viendo archivos en el directorio actual. El comando ls usa -Srp para asegurarse de que los directorios estén listados con una barra al final. El comando grep luego elimina esos directorios de la lista que se pasa a xargs .

El comando xargs luego usa X (esto podría ser cualquier palabra o carácter) como una variable de ciclo y luego usa wc -c para contar los caracteres en cada archivo.

$ ls -Srp | grep -v '/$' | xargs -I X wc -c X
64 file3
77 my new file
106 file2
361 file1

Tenga en cuenta que el carácter de bucle debe incluirse en dos posiciones en el comando.

Para ver los tres inicios de sesión más recientes para cada usuario que haya iniciado sesión actualmente, puede usar un comando como este:

$ who | awk '{print $1}' | xargs -I x last -3 x
shs      pts/0        192.168.0.24     Fri Oct 15 12:35   still logged in
shs      pts/0        192.168.0.9      Wed Oct 13 16:40 - 17:20  (00:39)
shs      pts/0        192.168.0.9      Wed Oct 13 15:56 - 16:26  (00:30)

wtmp begins Fri Mar 12 12:50:16 2021
nemo     pts/1        192.168.0.24     Fri Oct 15 13:13   still logged in
nemo     pts/1        192.168.0.10     Tue Sep  7 12:23 - 14:13  (01:50)
nemo     pts/1        192.168.0.10     Sun Aug 22 11:10 - 12:01  (00:51)

wtmp begins Fri Mar 12 12:50:16 2021

El bucle es necesario para que el comando se ejecute por separado para cada usuario.

Una de las cosas clave a tener en cuenta es que cualquier comando que use con xargs agregará el texto que le pase al final del comando. No puede usar un comando como el que se muestra a continuación y esperar que muestre los primeros tres meses de 2022 porque el comando cal espera que el año sea el argumento final:

$ echo 1 2 3 | xargs cal 2022
cal: bad usage
Try 'cal --help' for more information.

Pruebe el mismo comando sin 2022 al final y solo sabrá que el 1 de febrero del año 3 fue un jueves.

El comando xargs puede ser muy útil para proporcionar una manera fácil de ejecutar comandos, especialmente cuando se combina con comandos que ubican los archivos o especifican los usuarios que necesita verificar.