Comando xargs: uso, opções -n e -I e como usar com find

Ambiente de testeFamília RHELAlmaLinux 9.8conta rootVerificado em 2026-10-29

O comando xargs é uma ferramenta do Linux que transforma as linhas e palavras recebidas pela entrada padrão em argumentos de outro comando e o executa. Ao passar com o xargs para o wc três arquivos de log encontrados pelo find em uma pasta de trabalho de um servidor AlmaLinux 9, um arquivo com espaço no nome foi dividido em dois e gerou erro, e com -print0 e -0 apareceram as contagens de linhas dos três arquivos.

A saída abaixo foi obtida dentro de uma pasta de trabalho com a conta root de um servidor AlmaLinux 9.8. A lista de nomes, os logs e os arquivos temporários são arquivos de exemplo criados para o teste, e os endereços IP e caminhos de pasta neles também são valores de exemplo.

1️⃣ Uso básico do comando xargs

  • ↪️ Entrada padrão como argumentos do comando

O xargs divide a entrada padrão passada pelo comando anterior por espaços e quebras de linha e executa o comando escrito depois com essas partes como argumentos. Conferimos isso com names.txt, que tem um nome por linha.

cat names.txt
alice
bob
carol
dave
erin

Ao passar a saída do cat para xargs echo, as cinco linhas viram argumentos de um único echo e saem em uma linha.

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

Se você não escrever nenhum comando depois, o xargs executa echo, então o resultado é o mesmo.

cat names.txt | xargs
alice bob carol dave erin

O pipe liga a saída do comando anterior à entrada padrão do seguinte, então nada entra nos argumentos do comando seguinte. Se você só passar por pipe para wc -l o list.txt, com três nomes de arquivo, o wc conta as 3 linhas da própria lista.

cat list.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

Com o xargs no meio, os três nomes da lista viram argumentos do wc e a contagem de linhas aparece para cada arquivo.

cat list.txt | xargs wc -l
  3 logs/access.log
  2 logs/error.log
  1 tmp/keep.txt
  6 total

2️⃣ Opções -n e -I do xargs

  • ↪️ Tamanho do grupo, posição do argumento e conferência com -t

Sem opções, toda a entrada vai para uma única execução do comando. Para repetir o comando, defina com -n quantos argumentos são passados por vez. A figura abaixo mostra como os mesmos cinco nomes são agrupados conforme a opção.

🧩 Como o xargs agrupa a entrada padrão em argumentos do comando
Diagrama explicativo
⚙️ Opção
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① Entrada padrão (names.txt)alicebobcaroldaveerinUm nome por linha, cinco linhas.
② Agrupar em argumentosalicebobcaroldaveerinSem opções, os cinco formam um grupo.alicebobcaroldaveerin-n 2 agrupa de dois em dois e deixa o que sobra em um grupo próprio.alicebobcaroldaveerin-I {} trata uma linha como um grupo e a coloca no lugar de {}.
③ Comandos executados e saídaecho alice bob carol dave erinalice bob carol dave erinecho é executado uma vez.echo alice bobecho carol daveecho erinecho é executado três vezes, com uma linha por grupo.echo 'user: alice' echo 'user: bob' … cinco vezes da mesma forma até erinuser: aliceuser: bobuser: caroluser: daveuser: erinecho é executado cinco vezes, com um nome no lugar de {}.
Sem opções, o xargs junta todas as palavras lidas da entrada como argumentos de uma única execução. Os cinco nomes vão para um echo e saem em uma linha.
Com -n 2, as palavras são agrupadas de duas em duas e o comando é repetido. Os cinco nomes formam três grupos, então echo é executado três vezes.
Com -I {}, uma linha conta como uma unidade e ocupa o lugar de {} no comando, que é executado por linha. Use quando o argumento precisar ficar em outro lugar que não o final.

-n 1 executa echo para cada nome e saem cinco linhas.

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

-n 2 agrupa de dois em dois e passa o que sobra separado.

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

Para ver os comandos executados, adicione -t. A linha de comando aparece primeiro e a saída vem abaixo.

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

Se o argumento precisar ficar em outro lugar que não o final do comando, defina um marcador com -I. Uma linha por vez entra no lugar de {}, e se o mesmo texto aparecer várias vezes, todos são trocados.

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

Do mesmo jeito, dá para criar uma pasta por nome. Crie primeiro a pasta home e depois use -I {} para criar nela uma pasta por nome: surgem cinco pastas.

mkdir home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  bob  carol  dave  erin

-I trata uma linha como um argumento, então não pode ser usada com -n. Ao escrever as duas, -I foi ignorada com um aviso e {} saiu 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 linhas. Se uma linha tiver várias palavras, elas vão juntas, e em names.txt, com um nome por linha, -L 2 deu o mesmo resultado que -n 2.

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

3️⃣ Combinação de find e xargs

  • ↪️ Passar nomes de arquivo com espaços com -print0 e -0

Você não precisa montar uma lista de nomes à mão: pode passar direto ao xargs os arquivos encontrados pelo find. Ao buscar arquivos terminados em .log na pasta de logs, aparecem três, e um deles tem espaço no nome.

find /root/work/logs -name '*.log'
/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.log

Ao passar essa lista direto para xargs wc -l, o nome com espaço foi dividido em old e access.log, saíram duas linhas de erro e o total foi de 5 linhas, somando só dois arquivos.

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 do find separa os nomes com o caractere nulo em vez da quebra de linha, e -0 do xargs divide os argumentos apenas por esse caractere nulo. Com as duas, aparecem as contagens dos três arquivos, inclusive o que tem espaço.

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

A opção -exec do find faz o mesmo. Com + depois de {}, os arquivos encontrados são passados de uma vez, então o resultado é igual, e o find repassa os espaços dos nomes como estão. O xargs também aceita a saída de outros comandos, então use-o quando a entrada não vier só do find, ou quando precisar definir quantos itens passar por vez (-n) ou quantos executar ao mesmo tempo (-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 escolher só os arquivos encontrados que contêm um texto, coloque grep -l depois do xargs. Dois arquivos continham wp-login: o log de acesso e o log de erros.

find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login
/root/work/logs/access.log
/root/work/logs/error.log

4️⃣ Excluir arquivos com o comando xargs

  • ↪️ Ver antes com echo e confirmar com -p

Com rm depois do xargs, os arquivos encontrados são excluídos de uma vez, então confira antes quais arquivos serão passados. Com echo antes de rm, só aparece a linha de comando que seria executada e os arquivos continuam lá.

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

Com -p, o xargs pergunta se deve executar cada comando. Se você digitar n, nada é excluído e os três arquivos temporários continuam lá.

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

Se você digitar y, os três arquivos são excluídos e só keep.txt fica.

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

Se a entrada estiver vazia, o xargs executa o comando uma vez sem argumentos. Ao passar um arquivo vazio, o rm roda sem argumentos e dá o erro [rm: missing operand]; com -r, o comando nem é executado.

cat empty.txt | xargs rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ Execução paralela, delimitadores e opções do xargs

  • ↪️ Opções -P, -d e -a

🔲 Execução paralela e delimitadores

Quando os comandos rodam um a um, o tempo cresce com o número de alvos. -P define quantos comandos rodam ao mesmo tempo. Quatro sleep de 1, 2, 3 e 4 segundos levaram 10 segundos em sequência e terminaram em 4 segundos, o mais longo, ao mesmo tempo com -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

Se a entrada for dividida por um símbolo que não seja quebra de linha nem espaço, defina o delimitador com -d. Ao dividir com -d , três nomes unidos por vírgulas, sai uma linha por nome.

printf 'alice,bob,carol' | xargs -d , -n 1 echo
alice
bob
carol

Para ler de um arquivo em vez da entrada padrão, escreva o nome dele em -a. Os cinco nomes de names.txt foram para o echo sem pipe.

xargs -a names.txt echo
alice bob carol dave erin

🔲 Opções do comando xargs

📌 Principais opções: resultados deste artigo

OpçãoTarefaResultado neste artigo
-nDefine quantos argumentos vão para uma execução do comandoOs cinco nomes são agrupados de dois em dois com -n 2 e echo é executado três vezes
-IColoca uma linha por vez no marcador e executa por linhaUm nome ocupa o lugar de {}; escrita com -n, -I é ignorada com um aviso
-LDefine quantas linhas vão para uma execução do comandoEm um arquivo com um nome por linha, mesmo resultado de -n 2
-tImprime antes a linha de comando a executarA linha de comando aparece antes da saída
-0Divide a entrada apenas pelo caractere nulo (com find -print0)Sem ela, nomes com espaço são divididos e saem duas linhas de erro; com ela, os três arquivos dão 6 linhas
-pPergunta se deve executar cada comandoCom n continuam lá; com y os três arquivos são excluídos
-rNão executa o comando se a entrada estiver vaziaSem ela, [rm: missing operand]; com ela, não executa
-PDefine quantos comandos rodam ao mesmo tempoQuatro sleep: 10 segundos em sequência, 4 segundos com -P 4
-dDefine o delimitador que divide a entrada-d , dá uma linha por nome
-aLê a entrada de um arquivo em vez da entrada padrãoOs cinco nomes de names.txt vão para um único echo

📎 Outras opções: segundo o manual oficial

OpçãoTarefa
-sDefine o máximo de caracteres de uma linha de comando
-xAcima do tamanho de -s, termina sem executar
-EPara de ler a entrada ao chegar a uma linha só com este texto
-oReabre o terminal como entrada padrão do comando (para programas interativos)
--process-slot-varColoca um número diferente em uma variável de ambiente para cada comando simultâneo

🔲 Simulador do comando xargs

No simulador abaixo, você pode digitar comandos xargs e find nos mesmos arquivos de teste.

Simulador do comando xargsGNU findutils 4.8
[root@server work]#
Use as teclas ↑↓ para chamar de volta os comandos digitados antes.

🔢 FAQ & conteúdo recomendado

Se você passar um número de processo, o kill envia um sinal para esse número. Ao pegar com a variável do shell $! o número de um sleep 600 em segundo plano e passá-lo a xargs kill, [Terminated sleep 600] ficou na lista de tarefas e a tarefa sumiu no jobs seguinte. Ao reunir números com outro comando, imprima antes quais processos entram e só então passe a lista.

A opção --show-limits imprime os limites. No servidor testado, o limite POSIX do tamanho da linha de comando foi de 2,093,890 bytes, e o buffer de comando realmente usado pelo xargs foi de 131,072 bytes. Segundo o manual, se a entrada for maior que esse buffer, o xargs divide o comando em várias execuções.

Se qualquer comando executado pelo xargs falhar com um código de 1 a 125, o código de saída do xargs é 123. Tanto o wc com o nome de arquivo dividido quanto o rm com entrada vazia deram 123, e um comando não encontrado deu 127. Use esses valores ao verificar o código de saída depois do xargs em scripts de shell.

ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Demonstre sua humanidade: 2   +   2   =