Comando xargs Linux: Pasar Argumentos en Lote con Ejemplos Prácticos
El comando xargs es una de las herramientas más poderosas de la terminal Linux. Resuelve un problema simple pero frecuente: muchos comandos (rm, chmod, cp, ssh) no leen de la entrada estándar — necesitan recibir los argumentos directamente en la línea de comando. El xargs hace ese puente, transformando la salida de un pipe en argumentos.
Sin xargs, un find . -name "*.log" | rm simplemente no funciona. Con xargs, se convierte en find . -name "*.log" | xargs rm y procesa cientos de archivos a la vez.
Sintaxis del xargs
comando | xargs [opções] [comando_destino]
El xargs lee elementos de la entrada estándar (separados por espacio, tabulación o salto de línea por defecto) y los pasa como argumentos al comando_destino.
Ejemplo básico
# Sem xargs — não funciona como esperado
echo "arquivo.txt" | cat
# Com xargs — passa "arquivo.txt" como argumento para cat
echo "arquivo.txt" | xargs cat
# Vários arquivos de uma vez
ls *.conf | xargs wc -l
Principales opciones del xargs
| Opción | Qué hace | Ejemplo |
|---|---|---|
-n N | Máximo de N argumentos por llamada | xargs -n 2 |
-I {} | Reemplaza {} por el argumento en el comando | xargs -I{} mv {} {}.bak |
-P N | Ejecuta N procesos en paralelo | xargs -P 4 |
-0 | Usa null como separador (para nombres con espacios) | find -print0 | xargs -0 |
-t | Muestra el comando antes de ejecutar (verbose) | xargs -t rm |
-p | Pide confirmación antes de cada ejecución | xargs -p rm |
-L N | N líneas de entrada por llamada | xargs -L 1 |
--no-run-if-empty | No ejecuta si la entrada está vacía | xargs --no-run-if-empty rm |
Casos de uso prácticos
1. Eliminar archivos encontrados por find
Esta es la combinación más común. El find lista los archivos y el xargs pasa todos al rm de una vez, mucho más eficiente que find -exec rm {} \;:
# Deletar todos os arquivos .log com mais de 30 dias
find /var/log -name "*.log" -mtime +30 | xargs rm -f
# Ver quais seriam deletados antes de executar
find /var/log -name "*.log" -mtime +30 | xargs -t rm -f
2. Nombres de archivos con espacios — use -0
El mayor problema del xargs estándar es que los espacios rompen los argumentos. La solución es usar find -print0 junto con xargs -0:
# ERRADO — quebra em nomes com espaço
find . -name "*.jpg" | xargs rm
# CORRETO — separador null preserva nomes com espaço
find . -name "*.jpg" -print0 | xargs -0 rm
3. Reemplazo con -I {} para renombrar y transformar
Con -I {} defines dónde aparecerá el argumento en el comando — no necesariamente al final:
# Criar backup de cada arquivo .conf
ls *.conf | xargs -I{} cp {} {}.bak
# Mover arquivos para outro diretório mantendo o nome
find . -name "*.py" | xargs -I{} mv {} /opt/scripts/{}
# Criar diretórios com base em uma lista
cat projetos.txt | xargs -I{} mkdir -p /var/www/{}
# Fazer curl para múltiplos endpoints
cat urls.txt | xargs -I{} curl -s {} -o /dev/null -w "%{http_code} {}\n"
4. Ejecución paralela con -P
El flag -P N ejecuta N procesos simultáneos — ideal para operaciones que pueden paralelizarse como descargas, compresión o procesamiento de imágenes:
# Comprimir 8 arquivos em paralelo (usa múltiplos núcleos)
find . -name "*.log" -print0 | xargs -0 -P 8 gzip
# Baixar múltiplos arquivos em paralelo
cat lista_de_urls.txt | xargs -P 5 -I{} wget -q {}
# Redimensionar imagens em paralelo com ImageMagick
find . -name "*.png" -print0 | xargs -0 -P 4 -I{} convert {} -resize 800x600 {}
5. Controlar cantidad de argumentos con -n
Por defecto, el xargs pasa todos los argumentos de una vez. Con -n N limitas cuántos van en cada llamada — útil cuando el comando tiene un límite o cuando quieres procesar en grupos:
# Mostrar 2 arquivos por vez com cat
ls *.txt | xargs -n 2 cat
# Verificar 10 URLs por vez
cat urls.txt | xargs -n 10 curl --head
# Ver como os argumentos são agrupados (verbose)
seq 1 10 | xargs -n 3 echo
# Saída:
# 1 2 3
# 4 5 6
# 7 8 9
# 10
6. Buscar texto en muchos archivos con grep
# Buscar "erro crítico" em todos os logs do mês passado
find /var/log -name "*.log" -mtime -30 -print0 | xargs -0 grep -l "erro crítico"
# Contar ocorrências por arquivo
find . -name "*.php" -print0 | xargs -0 grep -c "sql_query"
# Buscar e substituir em múltiplos arquivos (com sed)
grep -rl "texto_antigo" . | xargs sed -i 's/texto_antigo/texto_novo/g'
7. Operaciones en servidores remotos
# Verificar status de serviço em múltiplos servidores
cat servidores.txt | xargs -I{} ssh {} "systemctl status nginx | grep Active"
# Copiar chave pública para vários servidores
cat servidores.txt | xargs -I{} ssh-copy-id user@{}
# Reiniciar serviço em todos os nós do cluster
cat nodes.txt | xargs -I{} -P 5 ssh {} "sudo systemctl restart app"
8. Verificar si la entrada está vacía
Sin --no-run-if-empty, el xargs ejecuta el comando incluso sin argumentos, lo que puede causar problemas:
# PERIGOSO — rm sem argumentos pode falhar ou apagar coisas erradas
find . -name "*.tmp" | xargs rm
# SEGURO — não executa rm se não houver arquivos .tmp
find . -name "*.tmp" | xargs --no-run-if-empty rm
xargs vs find -exec
Ambos resuelven problemas similares, pero con comportamientos diferentes:
| xargs | find -exec {} \; | find -exec {} + | |
|---|---|---|---|
| Velocidad | Rápido (pocos procesos) | Lento (1 proceso por archivo) | Rápido (agrupa argumentos) |
| Nombres con espacio | Necesita -print0 / -0 | Funciona de forma nativa | Funciona de forma nativa |
| Control de paralelo | Sí (-P) | No | No |
| Pipelines complejos | Sí | No | No |
# find -exec equivalente ao xargs (mais lento, 1 processo por arquivo)
find . -name "*.log" -exec rm {} \;
# find -exec + agrupa argumentos (similar ao xargs padrão)
find . -name "*.log" -exec rm {} +
# xargs com -print0/-0 é a opção mais segura e flexível
find . -name "*.log" -print0 | xargs -0 rm
Referencia rápida
# Deletar em lote com segurança
find . -name "*.tmp" -print0 | xargs -0 --no-run-if-empty rm
# Renomear adicionando extensão
ls *.txt | xargs -I{} mv {} {}.bak
# Comprimir em paralelo
find . -name "*.log" -print0 | xargs -0 -P $(nproc) gzip
# Buscar e substituir em múltiplos arquivos
grep -rl "padrão" . | xargs sed -i 's/padrão/novo/g'
# Executar em múltiplos servidores
cat hosts.txt | xargs -I{} -P 10 ssh {} "uptime"
# Ver como os argumentos serão divididos (dry run)
echo "a b c d e" | xargs -n 2 echo
Consejos y trampas
- Siempre usa
-print0 | xargs -0cuando los nombres de los archivos puedan tener espacios — que es casi siempre en sistemas de uso general. - Usa
-tpara depurar antes de ejecutar operaciones destructivas comorm. - Combina
-P $(nproc)para aprovechar todos los núcleos disponibles en operaciones paralelizables. - El
-I{}implica-L 1— cada línea se convierte en una llamada separada al comando. - Ten cuidado con las comillas en la sustitución:
xargs -I{} sh -c 'echo "valor: {}"'puede tener comportamiento inesperado con espacios en los argumentos.
Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.