El comando xargs es extremadamente útil cuando lo combinamos con otros comandos.
Este tutorial explica el uso del comando xargs usando algunos ejemplos simples.
Este ejemplo lo ayudará a comprender los conceptos básicos de cómo funciona el comando xargs. Pero, una vez que comprenda estos conceptos, podrá crear sus propios ejemplos ingeniosos de xargs para resolver varios problemas de la línea de comandos.
Sintaxis de xargs (de la página man):
xargs [-0prtx] [-E eof-str] [-e[eof-str]] [–eof[=eof-str]] [–null] [-d delimitador] [–delimiter delimitador] [-I replace- str] [-i[replace-str]] [–replace[=replace-str]] [-l[max-lines]] [-L max-lines] [–max-lines[=max-lines]] [ -n max-args] [–max-args=max-args] [-s max-chars] [–max-chars=max-chars] [-P max-procs] [–max-procs=max-procs] [–interactivo] [–verbose] [–exit] [–no-run-if-empty] [–arg-file=file] [–show-limits] [–version] [–help] [comando [argumentos-iniciales ]]
1. Ejemplo básico de Xargs
El comando xargs (de manera predeterminada) espera la entrada de stdin y ejecuta el comando /bin/echo sobre la entrada. Lo siguiente es lo que sucede cuando ejecuta xargs sin ningún argumento, o cuando lo ejecuta sin combinarlo con ningún otro comando.
Cuando escribe xargs sin ningún argumento, se le pedirá que ingrese la entrada a través de stdin:
$ xargs Hi, Welcome to TGS.
Después de escribir algo, presione ctrl+d, lo que le devolverá la cadena en la salida estándar como se muestra a continuación.
$ xargs Hi, Welcome to TGS.Hi, Welcome to TGS.
2. Especificar delimitador usando la opción -d
Se pueden aplicar delimitadores para que cada carácter en la entrada se tome literalmente usando la opción -d en xargs.
En el ejemplo anterior, aunque la entrada contenía un \n (nueva línea) después de 'Hola', la salida reflejada no contenía la nueva línea '\n'. Entonces, la salida del ejemplo anterior se combinó en una sola línea.
En el siguiente ejemplo, cuando usa -d\n, conservará el delimitador de nueva línea en la salida y mostrará la salida exactamente como se escribió.
$ xargs -d\n Hi, Welcome to TGS.
Después de escribir lo anterior, presione ctrl+d, lo que le devolverá la cadena en la salida estándar como se muestra a continuación. Pero esta vez conservará la nueva línea.
$ xargs -d\n Hi, Welcome to TGS.Hi, Welcome to TGS.
3. Limite la salida por línea usando la opción -n
De forma predeterminada, como se explicó anteriormente, xargs muestra todo lo que llega a su entrada estándar como se muestra a continuación.
$ echo a b c d e f| xargs a b c d e f
Pero, la salida del comando xargs se puede dividir en varias líneas usando la opción -n.
En el siguiente ejemplo, usamos -n 3, que mostrará solo 3 elementos por línea en la salida de xargs.
$ echo a b c d e f| xargs -n 3 a b c d e f
De la misma manera, también puede dividir la salida con 2 elementos por línea como se muestra a continuación usando -n 2.
$ echo a b c d e f| xargs -n 2 a b c d e f
4. Preguntar al usuario antes de la ejecución usando la opción -p
Con la opción -p, puede confirmar la ejecución del comando xargs del usuario.
Considerando el ejemplo anterior, si queremos confirmar cada ejecución del comando /bin/echo por parte del usuario, use la opción -p junto con la opción -n como se muestra a continuación.
$ echo a b c d e f| xargs -p -n 3 /bin/echo a b c ?...y /bin/echo d e f ?...a b c y d e f
En la siguiente salida, dije "n" a todas las salidas de eco. Entonces, xargs no ejecutó nada.
$ echo a b c d e f| xargs -p -n 3 /bin/echo a b c ?...n /bin/echo d e f ?...n /bin/echo ?...n
Nota:Esto es útil cuando combina xargs con comandos que son disruptivos como rm. En esos casos, es posible que desee ver qué hace xargs.
5. Evite /bin/echo predeterminado para la entrada en blanco usando la opción -r
Cuando hay una entrada en blanco (es decir, no se proporcionó ninguna entrada al comando xargs), ejecutará un comando /bin/echo que mostrará una nueva línea como se muestra a continuación.
$ xargs -p
Presione ctrl-d después de escribir "xargs -p", lo que indicará que ejecutó un /bin/echo como se muestra a continuación.
$ xargs -p /bin/echo ?...y $
6. Imprima el comando junto con la salida usando la opción -t
En el siguiente ejemplo, escriba "abcd" como entrada para el comando xargs -t.
$ xargs -t abcd
Presione ctrl-d para completar el comando xargs -t anterior, que mostrará el comando que xargs realmente ejecuta antes de mostrar el resultado. En este caso, el comando que ejecuta xargs es “/bin/echo abcd”, que se muestra aquí.
$ xargs -t abcd /bin/echo abcd abcd
7. Combine Xargs con el comando Buscar
Es uno de los usos más importantes del comando xargs. Cuando necesite encontrar cierto tipo de archivos y realizar ciertas acciones en ellos (la más popular es la acción de eliminar).
El comando xargs es muy efectivo cuando lo combinamos con otros comandos.
En el siguiente ejemplo, tomamos la salida del comando find y la pasamos como entrada al comando xargs. Pero, en lugar de ejecutar el comando predeterminado /bin/echo, le indicamos al comando xargs que ejecute el comando rm -rm en la entrada.
Entonces, en este ejemplo, la salida del comando de búsqueda son todos los archivos con la extensión *.c, que se proporciona como entrada al comando xargs, que a su vez ejecuta el comando "rm -rf" en todos los archivos *.c .
$ ls one.c one.h two.c two.h $ find . -name "*.c" | xargs rm -rf $ ls one.h two.h
8. Eliminar archivos que tienen espacios en blanco en el nombre de archivo
Entonces vemos que a pesar de ejecutar el comando rm en los archivos .c en este directorio, el archivo 'The Geek Stuff.c' no se eliminó. Esto se debe a que este archivo contiene espacios en blanco en su nombre.
Como se muestra en el siguiente ejemplo, eliminó todos los archivos con la extensión *.c excepto uno. es decir, el archivo que tiene un espacio en blanco en el nombre del archivo (es decir, "The Geek Stuff.c") no fue eliminado por el comando rm.
$ touch "The Geek Stuff.c" $ ls one.c one.h two.c two.h The Geek Stuff.c $ find . -name "*.c" | xargs rm -rf $ ls one.h two.h The Geek Stuff.c
En esta situación, use la opción -print0 con el comando de búsqueda y la opción -0 con el comando xargs para eliminar archivos, incluidos aquellos que tienen espacio en los nombres de archivo, como se muestra a continuación.
$ ls one.c one.h two.c two.h The Geek Stuff.c $ find . -name "*.c" -print0 | xargs -0 rm -rf $ ls one.h two.h
9. Mostrar los límites del sistema en xargs usando la opción –show-limits
Vea el siguiente ejemplo:
El siguiente ejemplo muestra todos los límites establecidos por el sistema operativo que tendrán un impacto en la forma en que funciona el comando xargs.
$ xargs --show-limits Your environment variables take up 1203 bytes POSIX upper limit on argument length (this system): 2093901 POSIX smallest allowable upper limit on argument length (all systems): 4096 Maximum length of command we could actually use: 2092698 Size of command buffer we are actually using: 131072 Execution of xargs will continue now, and it will try to read its input and run commands; if this is not what you wanted to happen, please type the end-of-file keystroke. Warning: /bin/echo will be run at least once. If you do not want that to happen, then press the interrupt keystroke
10. Combine Xargs con el comando Grep
El comando xargs se puede combinar con el comando grep para filtrar archivos particulares de los resultados de búsqueda del comando find.
En el siguiente ejemplo, el comando de búsqueda proporcionó todos los archivos .c como entrada para xargs.
El comando xargs ejecuta el comando grep para encontrar todos los archivos (entre los archivos proporcionados por el comando find) que contenían una cadena 'stdlib.h'.
$ find . -name '*.c' | xargs grep 'stdlib.h' ./tgsthreads.c:#include ./valgrind.c:#include ./direntry.c:#include ./xvirus.c:#include ./temp.c:#include ... ... ...