Comando xargs: uso, opciones -n e -I y cómo combinarlo con find

Entorno de pruebaFamilia RHELAlmaLinux 9.8Cuenta rootVerificado el 2026-10-29

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

  • ↪️ La entrada estándar como argumentos del comando

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.txt
alice
bob
carol
dave
erin

Si 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 echo
alice bob carol dave erin

Si no escribes ningún comando detrás, xargs ejecuta echo, así que el resultado es el mismo.

cat names.txt | xargs
alice bob carol dave erin

Una 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.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

Con 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 total

2️⃣ Opciones -n e -I de xargs

  • ↪️ Tamaño de grupo, posición del argumento y comprobación con -t

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.

🧩 Cómo agrupa xargs la entrada estándar en argumentos del comando
Diagrama explicativo
⚙️ Opción
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① Entrada estándar (names.txt)alicebobcaroldaveerinUn nombre por línea, cinco líneas.
② Agrupar en argumentosalicebobcaroldaveerinSin opciones, los cinco forman un grupo.alicebobcaroldaveerin-n 2 agrupa de dos en dos y pone el sobrante en su propio grupo.alicebobcaroldaveerin-I {} trata una línea como un grupo y la coloca en lugar de {}.
③ Comandos ejecutados y salidaecho alice bob carol dave erinalice bob carol dave erinecho se ejecuta una vez.echo alice bobecho carol daveecho erinecho se ejecuta tres veces y sale una línea por grupo.echo 'user: alice' echo 'user: bob' … cinco veces de la misma forma hasta erinuser: aliceuser: bobuser: caroluser: daveuser: erinecho se ejecuta cinco veces y un nombre ocupa el lugar de {}.
Sin opciones, xargs añade todas las palabras leídas de la entrada como argumentos de una sola ejecución. Los cinco nombres pasan a un solo echo y salen en una línea.
Con -n 2, las palabras se agrupan de dos en dos y el comando se repite. Los cinco nombres forman tres grupos, así que echo se ejecuta tres veces.
Con -I {}, una línea cuenta como una unidad y esa línea ocupa el lugar de {} en el comando, que se ejecuta por cada línea. Se usa cuando el argumento debe ir en un sitio que no sea el final.

-n 1 ejecuta echo por cada nombre y salen cinco líneas.

cat names.txt | xargs -n 1 echo
alice
bob
carol
dave
erin

-n 2 agrupa de dos en dos y pasa aparte el sobrante.

cat names.txt | xargs -n 2 echo
alice bob
carol dave
erin

Para 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 echo
echo alice bob
alice bob
echo carol dave
carol dave
echo erin
erin

Si 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: erin
cat names.txt | xargs -I {} echo '{} -> home/{}'
alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erin

Del 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 home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  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 echo
alice bob
carol dave
erin

3️⃣ Combinación de find y xargs

  • ↪️ Pasar nombres de archivo con espacios con -print0 y -0

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.log

Al 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 total

La 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 total

Para 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.log

4️⃣ Eliminar archivos con el comando xargs

  • ↪️ Previsualizar con echo y confirmar con -p

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 rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

Con -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 rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...n
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

Si introduces y, se borran los tres archivos y solo queda keep.txt.

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...y
ls tmp
keep.txt

Si 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 rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ Ejecución en paralelo, delimitadores y opciones de xargs

  • ↪️ Opciones -P, -d y -a

🔲 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.003s
time seq 1 4 | xargs -n 1 -P 4 sleep

real	0m4.005s
user	0m0.001s
sys	0m0.006s

Si 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 echo
alice
bob
carol

Para 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 echo
alice bob carol dave erin

🔲 Opciones del comando xargs

📌 Opciones principales: resultados de este artículo

OpciónTareaResultado en este artículo
-nFija cuántos argumentos se pasan a una ejecución del comandoLos cinco nombres se agrupan de dos en dos con -n 2 y echo se ejecuta tres veces
-IColoca cada línea en el marcador y ejecuta por líneaUn nombre ocupa el lugar de {}; escrita junto con -n, -I se ignora con un aviso
-LFija cuántas líneas se pasan a una ejecución del comandoEn un archivo con un nombre por línea, igual que -n 2
-tImprime primero la línea de comando que se va a ejecutarLa línea de comando sale antes que la salida
-0Divide 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
-pPregunta si ejecutar cada comandoCon n siguen ahí; con y se borran los tres archivos
-rNo ejecuta el comando si la entrada está vacíaSin ella, [rm: missing operand]; con ella, no se ejecuta
-PFija cuántos comandos se ejecutan a la vezCuatro sleep: 10 segundos seguidos, 4 segundos con -P 4
-dFija el delimitador que divide la entrada-d , da una línea por nombre
-aLee la entrada de un archivo en lugar de la entrada estándarLos cinco nombres de names.txt van a un solo echo

📎 Otras opciones: según el manual oficial

OpciónTarea
-sFija el máximo de caracteres de una línea de comando
-xSi supera el tamaño de -s, termina sin ejecutar
-EDeja de leer la entrada al llegar a una línea con solo este texto
-oReabre la terminal como entrada estándar del comando (para programas interactivos)
--process-slot-varPone 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.

Simulador del comando xargsGNU findutils 4.8
[root@server work]#
Con las teclas ↑↓ recuperas los comandos que escribiste antes.

🔢 FAQ & contenido recomendado

Si pasas un número de proceso, kill envía una señal a ese número. Al sacar con la variable del shell $! el número de proceso de un sleep 600 en segundo plano y pasarlo a xargs kill, quedó [Terminated sleep 600] en la lista de trabajos y el trabajo desapareció en el siguiente jobs. Cuando reúnas números con otro comando, imprime antes qué procesos se incluyen y luego pásalos.

La opción --show-limits imprime los límites. En el servidor de la prueba, el límite POSIX de longitud de línea de comando fue de 2,093,890 bytes, y el búfer de comando que usa realmente xargs fue de 131,072 bytes. Según el manual, si la entrada supera este búfer, xargs divide el comando en varias ejecuciones.

Si alguno de los comandos ejecutados por xargs falla con un código entre 1 y 125, el código de salida de xargs es 123. Tanto el wc en que se partió el nombre con espacio como el rm con entrada vacía dieron 123, y un comando no encontrado dio 127. Usa estos valores al comprobar el código de salida tras xargs en scripts de shell.

ℹ️ 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Demuestra que eres humano: 9   +   8   =