Comando xargs: uso, opciones -n e -I y cómo combinarlo con find
El comando xargs es una herramienta de Linux que convierte las líneas y palabras recibidas por la entrada estándar en argumentos de otro comando y lo ejecuta. Al pasar con xargs a wc tres archivos de registro encontrados por find en una carpeta de trabajo de un servidor AlmaLinux 9, un archivo con un espacio en el nombre se partió en dos y dio error, y con -print0 y -0 aparecieron los recuentos de líneas de los tres archivos.
La salida de abajo se ejecutó dentro de una carpeta de trabajo con la cuenta root de un servidor AlmaLinux 9.8. La lista de nombres, los registros y los archivos temporales son archivos de ejemplo creados para la prueba, y las direcciones IP y rutas de carpetas que contienen también son valores de ejemplo.
1️⃣ Uso básico del comando xargs
xargs divide la entrada estándar que le pasa el comando anterior por espacios y saltos de línea, y ejecuta el comando escrito detrás colocando esas partes como argumentos. Lo comprobamos con names.txt, que tiene un nombre por línea.
cat names.txtalice
bob
carol
dave
erinSi pasas la salida de cat a xargs echo, las cinco líneas se convierten en argumentos de un solo echo y salen en una línea.
cat names.txt | xargs echoalice bob carol dave erinSi no escribes ningún comando detrás, xargs ejecuta echo, así que el resultado es el mismo.
cat names.txt | xargsalice bob carol dave erinUna tubería conecta la salida del comando anterior con la entrada estándar del siguiente, así que nada entra en los argumentos del siguiente comando. Si solo pasas por tubería a wc -l el archivo list.txt, que tiene tres nombres de archivo, wc cuenta las 3 líneas de la propia lista.
cat list.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3Con xargs en medio, los tres nombres de la lista pasan a ser argumentos de wc y aparece el recuento de líneas de cada archivo.
cat list.txt | xargs wc -l 3 logs/access.log
2 logs/error.log
1 tmp/keep.txt
6 total2️⃣ Opciones -n e -I de xargs
Sin opciones, toda la entrada va a una sola ejecución del comando, así que para repetirlo usa -n y fija cuántos argumentos se pasan cada vez. En la figura de abajo ves cómo se agrupan los mismos cinco nombres según la opción.
-n 1 ejecuta echo por cada nombre y salen cinco líneas.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2 agrupa de dos en dos y pasa aparte el sobrante.
cat names.txt | xargs -n 2 echoalice bob
carol dave
erinPara ver los comandos que se ejecutan, añade -t. Primero sale la línea de comando y debajo su salida.
cat names.txt | xargs -t -n 2 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erinSi el argumento debe ir en un sitio que no sea el final del comando, fija un marcador con -I. Cada línea entra en lugar de {}, y si el mismo texto aparece varias veces, se cambian todos.
cat names.txt | xargs -I {} echo 'user: {}'user: alice
user: bob
user: carol
user: dave
user: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erinDel mismo modo puedes crear una carpeta por nombre. Crea primero la carpeta home y luego usa -I {} para crear debajo una carpeta por nombre: aparecen cinco carpetas.
mkdir homecat names.txt | xargs -I {} mkdir home/{}ls homealice bob carol dave erin-I trata una línea como un solo argumento, así que no se puede usar con -n. Al escribir ambas, -I se ignoró con un aviso y {} salió como texto literal.
cat names.txt | xargs -I {} -n 2 echo {}xargs: warning: options --replace and --max-args/-n are mutually exclusive, ignoring previous --replace value
{} alice bob
{} carol dave
{} erin-L agrupa por número de líneas. Si una línea tiene varias palabras, se pasan juntas, y en names.txt, con un nombre por línea, -L 2 dio el mismo resultado que -n 2.
cat names.txt | xargs -L 2 echoalice bob
carol dave
erin3️⃣ Combinación de find y xargs
No hace falta crear a mano una lista de nombres: puedes pasar a xargs directamente los archivos que encuentra find. Al buscar archivos terminados en .log en la carpeta de registros aparecen tres, y uno tiene un espacio en el nombre.
find /root/work/logs -name '*.log'/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.logAl pasar esta lista tal cual a xargs wc -l, el nombre con espacio se partió en old y access.log, salieron dos líneas de error y el total fue de 5 líneas, sumando solo dos archivos.
find /root/work/logs -name '*.log' | xargs wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
wc: /root/work/logs/old: No such file or directory
wc: access.log: No such file or directory
5 total-print0 de find separa los nombres con el carácter nulo en lugar del salto de línea, y -0 de xargs divide los argumentos solo por ese carácter nulo. Con ambas aparecen los recuentos de los tres archivos, incluido el que tiene un espacio.
find /root/work/logs -name '*.log' -print0 | xargs -0 wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalLa opción -exec de find hace lo mismo. Con + detrás de {}, los archivos encontrados se pasan de una vez, así que el resultado es el mismo, y find pasa tal cual los espacios de los nombres. xargs también acepta la salida de otros comandos, así que úsalo cuando la entrada no venga solo de find, o cuando debas fijar cuántos elementos pasar cada vez (-n) o cuántos ejecutar a la vez (-P).
find /root/work/logs -name '*.log' -exec wc -l {} + 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalPara elegir solo los archivos encontrados que contienen una cadena, añade grep -l detrás de xargs. Los archivos con wp-login fueron dos: el registro de acceso y el de errores.
find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login/root/work/logs/access.log
/root/work/logs/error.log4️⃣ Eliminar archivos con el comando xargs
Si pones rm detrás de xargs, los archivos encontrados se borran de una vez, así que comprueba antes qué archivos se pasarán. Si pones echo delante de rm, solo sale la línea de comando que se ejecutaría y los archivos siguen ahí.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 echo rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmpls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txtCon -p, xargs pregunta si ejecutar cada comando. Si introduces n no se borra nada y los tres archivos temporales siguen ahí.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...nls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txtSi introduces y, se borran los tres archivos y solo queda keep.txt.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...yls tmpkeep.txtSi la entrada está vacía, xargs ejecuta el comando una vez sin argumentos. Al pasar un archivo vacío, rm se ejecuta sin argumentos y da el error [rm: missing operand]; con -r, el comando no llega a ejecutarse.
cat empty.txt | xargs rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ Ejecución en paralelo, delimitadores y opciones de xargs
🔲 Ejecución en paralelo y delimitadores
Cuando los comandos se ejecutan uno a uno, el tiempo crece con el número de objetivos. -P fija cuántos comandos se ejecutan a la vez. Cuatro sleep de 1, 2, 3 y 4 segundos tardaron 10 segundos seguidos y terminaron en 4 segundos, el más largo, a la vez con -P 4.
time seq 1 4 | xargs -n 1 sleep
real 0m10.007s
user 0m0.004s
sys 0m0.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006sSi la entrada se divide con un símbolo que no sea salto de línea ni espacio, fija el delimitador con -d. Al dividir con -d , tres nombres unidos por comas sale una línea por nombre.
printf 'alice,bob,carol' | xargs -d , -n 1 echoalice
bob
carolPara leer de un archivo en lugar de la entrada estándar, escribe su nombre en -a. Los cinco nombres de names.txt pasaron a echo sin tubería.
xargs -a names.txt echoalice bob carol dave erin🔲 Opciones del comando xargs
📌 Opciones principales: resultados de este artículo
| Opción | Tarea | Resultado en este artículo | |
|---|---|---|---|
| -n | Fija cuántos argumentos se pasan a una ejecución del comando | Los cinco nombres se agrupan de dos en dos con -n 2 y echo se ejecuta tres veces | |
| -I | Coloca cada línea en el marcador y ejecuta por línea | Un nombre ocupa el lugar de {}; escrita junto con -n, -I se ignora con un aviso | |
| -L | Fija cuántas líneas se pasan a una ejecución del comando | En un archivo con un nombre por línea, igual que -n 2 | |
| -t | Imprime primero la línea de comando que se va a ejecutar | La línea de comando sale antes que la salida | |
| -0 | Divide la entrada solo por el carácter nulo (con find -print0) | Sin ella, los nombres con espacio se parten y salen dos líneas de error; con ella, los tres archivos dan 6 líneas | |
| -p | Pregunta si ejecutar cada comando | Con n siguen ahí; con y se borran los tres archivos | |
| -r | No ejecuta el comando si la entrada está vacía | Sin ella, [rm: missing operand]; con ella, no se ejecuta | |
| -P | Fija cuántos comandos se ejecutan a la vez | Cuatro sleep: 10 segundos seguidos, 4 segundos con -P 4 | |
| -d | Fija el delimitador que divide la entrada | -d , da una línea por nombre | |
| -a | Lee la entrada de un archivo en lugar de la entrada estándar | Los cinco nombres de names.txt van a un solo echo |
📎 Otras opciones: según el manual oficial
| Opción | Tarea | |
|---|---|---|
| -s | Fija el máximo de caracteres de una línea de comando | |
| -x | Si supera el tamaño de -s, termina sin ejecutar | |
| -E | Deja de leer la entrada al llegar a una línea con solo este texto | |
| -o | Reabre la terminal como entrada estándar del comando (para programas interactivos) | |
| --process-slot-var | Pone un número distinto en una variable de entorno para cada comando simultáneo |
🔲 Simulador del comando xargs
En el simulador de abajo puedes escribir tú mismo comandos xargs y find sobre los mismos archivos de prueba.
🔢 FAQ & contenido recomendado
Búsqueda de cadenas
Comando grep de Linux
El comando grep busca dentro de archivos las líneas que coinciden con cadenas y expresiones regulares. Úsalo para buscar de una vez en varios archivos pasados con xargs.
Eliminar archivos
Comando rm de Linux
Artículo sobre el comando rm, que borra archivos y carpetas, y los peligros de la opción -rf. Comprueba las opciones antes de poner rm detrás de xargs.
Finalizar procesos
Comando kill de Linux
El comando kill envía una señal a un número de proceso para finalizarlo. Úsalo a continuación cuando pases con xargs una lista de números de proceso para terminarlos.
ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.