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:
1 |
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:
1 |
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:
1 |
rm -rf archivo1 archivo2 archivo3 archivo4 archivo5 |
Con la opcion -n podemos especificar el numero de argumentos en una linea, por ejemplo:
1 |
ls | xargs -n1 rm -rf |
Mostraria:
1 2 3 4 5 |
rm -rf archivo1 rm -rf archivo2 rm -rf archivo3 rm -rf archivo4 rm -rf archivo5 |
Si ponemos -n2, mostraria:
1 2 3 |
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:
1 |
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:
1 2 3 4 5 6 7 8 9 |
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 :
1 |
find /etc -iname "*.conf" | awk '{ print "cp",$0,"/backup"}' | bash |
Una explicación perfecta, bien ilustarado, me ha servido de gran ayuda gracias.