Uso del comando XARGS

By Published On: 7 de abril de 2011Categories: GNU-Linux4 Comments

El comando xargs nos permite construir y ejecutar comandos desde la entrada estándar, para dar un ejemplo de su uso voy a hacer referencia a un viejo articulo que publique hace meses atrás llamado «Construyendo una serie de comandos con AWK«, en donde como su nombre lo indica… escribí una forma para construir una serie de comandos utilizando AWK, en ese entonces no conocía de la existencia de el comando xargs, con el cual vamos a poder realizar lo mismo de una manera mas simple (A mi personalmente me gusta el viejo método, lo encuentro mas personalizable), el uso de xargs es bien simple, y lo explicare con ejemplos…

Si por ejemplo quisiéramos buscar todos los ficheros .conf del directorio /etc que contengan la palabra root dentro de su contenido… podemos utilizar el comando find (Para buscar todos los ficheros de /etc que terminen en .conf), y luego con ese resultado utilizamos xarg en conjunto con grep (xarg lo utilizaremos para que ejecute el filtro grep con el resultado como entrada).
El comando seria el siguiente:
find /etc -iname «*.conf» | xargs grep «root»
Y veremos como resultado todos los ficheros con root en su contenido y la linea con la palabra a su lado.
En este ejemplo no hemos utilizado xargs con ninguna opcion, y para el siguiente ejemplo tampoco utilizaremos ninguna opcion para poder indentificar algunas diferencias importantes, por ejemplo si estamos en un directorio y queremos borrar todo su contenido (Normalmente podemos hacer esto con rm -rf *, pero es un ejemplo para que aprendamos como funciona xargs), hariamos lo siguiente:
ls | xargs rm -rf
Esto nos borraria todos los archivos de el directorio en el que estamos, y aunque no lo veamos el comando que se genero, poniendo de ejemplo que hay 5 archivos es el siguiente:
rm -rf archivo1 archivo2 archivo3 archivo4 archivo5
Con la opcion -n podemos especificar el numero de argumentos en una linea, por ejemplo:
ls | xargs -n1 rm -rf
Mostraria:
rm -rf archivo1 
rm -rf archivo2
rm -rf archivo3
rm -rf archivo4
rm -rf archivo5
Si ponemos -n2, mostraria:
rm -rf archivo1 archivo2
rm -rf archivo3 archivo 4
Ahora que entendemos como esta funcionando xargs, podemos pasar a construir una serie de comandos al igual que como lo hicimos con AWK.
Si por ejemplo queremos que todos los ficheros del directorio /etc que terminen con .conf sean movidos a un directorio especifico (En este ejemplo /backup), utilizaremos xargs con la opcion -I, de la siguiente manera:
find /etc -iname «*.conf» | xargs -I ARG cp ARG /backup
Donde lo que escribamos delante de el primer ARG sera el primer argumento y lo que escribamos delante de el segundo ARG sera el tercer argumento, y el resultado del find seria el segundo, el comando anterior estaria haciendo lo siguiente:
cp /etc/prueba.conf /backup
cp /etc/prueba2.conf /backup

cp /etc/prueba3.conf /backup
cp /etc/prueba4.conf /backup
cp /etc/prueba5.conf /backup
cp /etc/prueba6.conf /backup
cp /etc/prueba7.conf /backup
Y esto seria una alternativa a tener que realizar el siguiente comando utilizando AWK:
find /etc -iname «*.conf» | awk ‘{ print «cp»,$0,»/backup»}’ | bash
Y con esto finaliza esta guia de xargs, ojala y le saquen provecho a esta magnifica herramienta Unix.
Un saludo y hasta la proxima!

4 Comments

  1. Alejandrox 10 de abril de 2011 at 13:51 - Reply

    A mi se me hace más facil usar XARGS que el metodo con AWK, gracias por compartirlo!

  2. GtzGtz 17 de abril de 2011 at 12:35 - Reply

    Una tercera alternativa seria utilizar la opción -exec de find:
    find /etc- iname "*.conf" -exec grep -i root {} ;
    Con lo cual se logra algo similar, parte de la magia y flexibilidad del la línea de comandos en Linux.
    Gracias por el artículo.

  3. Test 17 de abril de 2011 at 14:19 - Reply

    Es cierto GtzGtz!
    Siempre hay una forma diferente de realizar el mismo procedimiento, es cuestion de gustos y comodidad 😛

    Muchas Gracias amigo!

  4. Unknown 12 de diciembre de 2013 at 15:41 - Reply

    Muchas Gracias por el articulo amigo!

    Me ayudo a aclarar unas dudas que tenia sobre este comando

    saludos

Leave A Comment