Los xargs de Linux Puede que el comando no sea una herramienta de línea de comandos muy popular, pero esto no quita el hecho de que es extremadamente útil, especialmente cuando se combina con otros comandos como buscar y grep . Si eres nuevo en xargs y quieres entender su uso, te alegrará saber que eso es exactamente lo que haremos aquí.
Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 18.04 LTS (Bionic Beaver). Shell used is Bash, and version is 4.4.19.
1. ¿Cómo funciona el comando Xargs?
Bueno, antes de pasar a su uso, es importante comprender qué hace exactamente Xargs. En términos sencillos, la herramienta, en su forma más básica, lee datos de la entrada estándar (stdin) y ejecuta el comando (suministrado como argumento) una o más veces en función de la lectura de entrada. Los espacios en blanco y los espacios en la entrada se tratan como delimitadores, mientras que las líneas en blanco se ignoran.
Si no se proporciona ningún comando como argumento para xargs, el comando predeterminado que ejecuta la herramienta es echo . Por ejemplo, en el siguiente ejemplo, simplemente ejecuté 'xargs' e ingresé 'Hello World' en stdin. Mientras presionaba Ctrl+D (para decirle a xargs que hemos terminado con la entrada), el echo El comando se ejecutó automáticamente y se imprimió de nuevo 'Hello World'.
2. ¿Cómo usar xargs con otro comando?
Mientras eco es el comando predeterminado que ejecuta xargs, puede especificar explícitamente cualquier otro comando. Por ejemplo, puede pasar el comando de búsqueda junto con su opción '-name' como argumento a xargs, y luego pasar el nombre del archivo (o tipo de archivos) que desea buscar para buscar como entrada a través de stdin.
Este es el comando completo en cuestión:
xargs find -name
Por ejemplo, proporcionamos "*.txt" en la entrada a través de stdin, lo que significa que queremos que buscar comando para buscar todos los archivos .txt en el directorio actual (así como sus subdirectorios).
Aquí está el comando en acción:
3. Cómo hacer que xargs ejecute el comando varias veces (una vez para cada línea de entrada/argumento)
En el ejemplo que analizamos en la sección anterior, queríamos buscar archivos .txt, por lo que proporcionamos "*.txt" en la entrada. Pero, ¿y si el requisito es buscar también otros tipos de archivos, como .log y .tmp?
Intente dar estos como entrada a xargs después de "*.txt" y vea qué sucede. Bueno, debería obtener un error similar al siguiente:
Eso es porque xargs pasa "*.txt" y "*.log" como entrada de nombre de archivo a find comando y luego buscar falla ya que se ejecuta con dos nombres de archivo en la entrada. Puede pensar en el comando de búsqueda ejecutándose de la siguiente manera:
find -name "*.txt" "*.log"
Y no es la forma correcta.
Lo que queremos es que el comando xargs pase primero "*.txt" a find comando, de modo que buscar nos da resultados relacionados con archivos .txt, y luego se pasa "*.log". Esto se puede hacer usando -L proporciona la opción de línea de comandos xargs.
El -L La opción de línea de comando requiere un número que trata como el número máximo de líneas que no están en blanco que se deben pasar como entrada al comando a la vez. Entonces, en nuestro caso, ese valor será 1, ya que queremos que se pase una línea de entrada como entrada para buscar a la vez.
Entonces, aquí está el comando que debemos ejecutar:
xargs -L 1 find -name
La siguiente captura de pantalla muestra el comando antes mencionado en acción:
Hasta aquí todo bien. Pero, ¿qué sucede si pasa la entrada de la siguiente manera:
"*.txt" "*.log"
Bueno, el comando fallará porque '-L 1' se asegurará de que la línea completa se pase a find comando.
En situaciones como estas, puede utilizar la opción de línea de comandos '-n'.
La opción de línea de comando '-n', como '-L', requiere un número que represente la cantidad de argumentos que desea que xargs pase por línea de comando. En el caso que acabamos de discutir, "*.txt" y "*.log" deberían ser argumentos diferentes, y dado que queremos que se pasen individualmente, tendremos que proporcionar '1' como valor a '-n' .
xargs -n 1 buscar -nombre
Estas son las formas en que podemos hacer que xargs ejecute un comando varias veces.
4. Cómo hacer que xargs maneje nombres de archivo con espacios
Si recuerda, al principio, mencionamos que xargs trata los espacios en blanco (así como los caracteres de nueva línea) como delimitadores. Esto puede causar problemas en los casos en que los nombres de archivo que se pasan como entrada a xargs contienen espacios.
Por ejemplo, suponga que el directorio actual contiene un archivo llamado 'nueva música.mp3' y desea que xargs pase este nombre a mplayer para que este último pueda reproducir el archivo. Si vas por el camino convencional, obtendrás un error:
Esto se debe a que, debido al espacio entre 'nuevo' y 'música.mp3', mplayer los trata como dos archivos diferentes. Una forma de resolver este problema es usar una barra invertida al proporcionar la entrada:
new\ music.mp3
La otra forma es cambiar el delimitador, lo que puede hacer usando -d opción. Por ejemplo, puede pedirle a xargs que solo considere la nueva línea como delimitador, algo que se puede hacer de la siguiente manera:
xargs -d '\n' mplayer
5. Cómo hacer que xargs maneje nombres de archivo con caracteres de nueva línea
Entonces, ahora sabemos cómo podemos hacer que xargs maneje los nombres de archivo que contienen espacios en blanco. Pero ¿qué pasa con las nuevas líneas? Sí, los nombres de archivo también pueden tener caracteres de nueva línea. Por ejemplo, hay un archivo llamado 'foo'[newline]'file.txt'. En la terminal, el nombre se muestra como 'foo?file.txt'.
Ahora, supongamos que quiero el find comando para encontrar todos los archivos con nombres que comiencen con el texto "foo" y luego use xargs para abrir estos archivos en gedit . Aquí está el comando:
find . -name "foo*" | xargs gedit
Lamentablemente, el comando no logra su propósito ya que se abre un nuevo archivo con el nombre 'foo' en Gedit. Es probable que se deba a que xargs trata el carácter de nueva línea como un delimitador.
Para solucionar este problema, utilice -print0 opción que encuentra ofertas y las combina con -0 de xarg opción. Así es como la página man de find explica esta opción:
-print0
True; print the full file name on the standard output, followed by a null character (instead of thenewline character that -print uses). This allows file names that contain newlines or other types ofwhite space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.
Entonces, este es el comando que deberíamos usar:
find . -name "foo*" -print0 | xargs -0 gedit
6. Cómo encontrar archivos que contengan un texto específico
El comando xargs resulta muy útil si desea buscar archivos que contengan un texto o cadena específicos. Por ejemplo, si desea buscar archivos .txt que contengan el texto 'abc', puede hacerlo de la siguiente manera:
find -name "*.txt" | xargs grep "abc"
Aquí está el comando en acción:
Como es bastante obvio, en este caso, el comando xargs obtiene su entrada de find comando.
7. Cómo hacer que xargs acepte entradas de un archivo
Hasta ahora, hemos visto que xargs acepta entradas de stdin (que es el comportamiento predeterminado), así como de otro comando (discutido en la última sección). Sin embargo, si lo desea, también puede hacer que xargs acepte la entrada de un archivo.
El comando -a opción le permite hacer esto. Esta opción espera un nombre de archivo:este sería el archivo del que xargs leerá la entrada.
Por ejemplo, supongamos que hay un archivo con el nombre 'input.txt'. Contiene la entrada para xargs (básicamente, el contenido son dos nombres de archivo:testfile1.txt y testfile2.txt). Así es como se pueden usar xargs para leer la entrada de este archivo y pasarla a otro comando, digamos ls .
xargs -a input.txt ls -lart
Aquí está el comando en acción:
8. Cómo hacer que los xargs busquen el permiso del usuario antes de ejecutar un comando
Ya hemos discutido cómo puede hacer que xargs ejecute un comando varias veces (consulte el punto 3 anterior). Pero, ¿qué sucede si desea que xargs solicite su permiso cada vez que ejecuta el comando? es posible? Sí, lo es - el -p opción de línea de comandos lo hace posible.
Aquí hay un ejemplo de cómo puede ejecutar xargs en un modo interactivo:
Acabamos de arañar la superficie aquí, ya que hay muchas otras características que proporciona el comando xargs en forma de opciones de línea de comandos. Pruebe los conceptos/características de xargs que hemos explicado en este tutorial y, en caso de duda o consulta, consulte su página de manual.