Comando xargs: uso, opções -n e -I e como usar com find
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
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.txtalice
bob
carol
dave
erinAo 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 echoalice bob carol dave erinSe você não escrever nenhum comando depois, o xargs executa echo, então o resultado é o mesmo.
cat names.txt | xargsalice bob carol dave erinO 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.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3Com 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 total2️⃣ Opções -n e -I do xargs
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.
-n 1 executa echo para cada nome e saem cinco linhas.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2 agrupa de dois em dois e passa o que sobra separado.
cat names.txt | xargs -n 2 echoalice bob
carol dave
erinPara 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 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erinSe 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: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erinDo 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 homecat names.txt | xargs -I {} mkdir home/{}ls homealice 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 echoalice bob
carol dave
erin3️⃣ Combinação de find e xargs
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.logAo 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 totalA 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 totalPara 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.log4️⃣ Excluir arquivos com o comando xargs
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 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.txtCom -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 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.txtSe 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 rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...yls tmpkeep.txtSe 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 rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ Execução paralela, delimitadores e opções do xargs
🔲 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.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006sSe 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 echoalice
bob
carolPara 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 echoalice bob carol dave erin🔲 Opções do comando xargs
📌 Principais opções: resultados deste artigo
| Opção | Tarefa | Resultado neste artigo | |
|---|---|---|---|
| -n | Define quantos argumentos vão para uma execução do comando | Os cinco nomes são agrupados de dois em dois com -n 2 e echo é executado três vezes | |
| -I | Coloca uma linha por vez no marcador e executa por linha | Um nome ocupa o lugar de {}; escrita com -n, -I é ignorada com um aviso | |
| -L | Define quantas linhas vão para uma execução do comando | Em um arquivo com um nome por linha, mesmo resultado de -n 2 | |
| -t | Imprime antes a linha de comando a executar | A linha de comando aparece antes da saída | |
| -0 | Divide 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 | |
| -p | Pergunta se deve executar cada comando | Com n continuam lá; com y os três arquivos são excluídos | |
| -r | Não executa o comando se a entrada estiver vazia | Sem ela, [rm: missing operand]; com ela, não executa | |
| -P | Define quantos comandos rodam ao mesmo tempo | Quatro sleep: 10 segundos em sequência, 4 segundos com -P 4 | |
| -d | Define o delimitador que divide a entrada | -d , dá uma linha por nome | |
| -a | Lê a entrada de um arquivo em vez da entrada padrão | Os cinco nomes de names.txt vão para um único echo |
📎 Outras opções: segundo o manual oficial
| Opção | Tarefa | |
|---|---|---|
| -s | Define o máximo de caracteres de uma linha de comando | |
| -x | Acima do tamanho de -s, termina sem executar | |
| -E | Para de ler a entrada ao chegar a uma linha só com este texto | |
| -o | Reabre o terminal como entrada padrão do comando (para programas interativos) | |
| --process-slot-var | Coloca 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.
🔢 FAQ & conteúdo recomendado
Busca de texto
Comando grep do Linux
O comando grep encontra dentro de arquivos as linhas que combinam com textos e expressões regulares. Use-o para buscar de uma vez em vários arquivos passados pelo xargs.
Excluir arquivos
Comando rm do Linux
Artigo sobre o comando rm, que exclui arquivos e pastas, e os perigos da opção -rf. Confira as opções antes de colocar rm depois do xargs.
Encerrar processos
Comando kill do Linux
O comando kill envia um sinal a um número de processo para encerrá-lo. Use-o na sequência ao passar pelo xargs uma lista de números de processo para encerrá-los.
ℹ️ 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.