El comando xargs nos permite construir y ejecutar comandos desde la entrada estándar, 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 sabemos como funciona el comando XARGS, podremos construir una serie de comandos, 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 ...
De la misma forma se podria construir con el comando AWK de la siguiente forma :
find /etc -iname "*.conf" | awk '{ print "cp",$0,"/backup"}' | bash
Una explicación perfecta, bien ilustarado, me ha servido de gran ayuda gracias.