Comando xargs: Como Usar e Automatizar Tarefas no Terminal

Compartilhe:

máquina representando o comando xargs linux recebendo dados da entrada e passando para outros comandos

Está utilizando o terminal e precisa executar comandos que tem uma lista de argumentos muito longa ? O comando xargs é ideal para essas situações, pois permite capturar a saída de um comando e passá-la como argumento para outro de forma extremamente ágil.

Você utilizará o comando xargs quando precisar automatizar rotinas, como: aplicar permissões em lote, mover muitos arquivos para diretórios específicos ou criar arquivos a partir de uma lista com rapidez.

Neste artigo, você aprenderá exatamente como o comando xargs funciona, como instalá-lo nas principais distribuições linux e como usa-lo com exemplos práticos.


Pré-requisitos

Para conseguir colocar em prática os conhecimentos técnicos do artigo, você precisará:

  • Computador com distribuição linux instalada, como: ubuntu, debian, redhat ou derivados.
  • Acessar o terminal com usuário root ou comando sudo para instalar o comando xargs, caso não esteja instalado.

Para que serve o comando xargs ?

O comando xargs serve para ler dados da entrada padrão (STDIN), normalmente através do “|” (PIPE) e executa comandos utilizando essa entrada como argumento.

Como existem comandos no linux que não lê dados a partir do PIPE (como: rm e chmod), então o xargs dá uma mãozinha. Assim, o comando xargs transforma a saída de programas (como: cat, find ou ls) em argumentos para outro comando (como: rm, chmod, cp ou mkdir).

O xargs faz parte do pacote findutils, que já vêm pré-instalado na grande maioria das distribuições linux, mas caso precise instala-lo, utilize os gerenciadores de pacote da sua distro.

Para instalar no debian e ubuntu e distros derivadas, execute os comandos:

Em distros Red Hat, AlmaLinux e Rocky Linux, instale o pacote findutils executando o comando:

Usando o comando xargs

Para utilizar o comando xargs é essencial entender primeiro a sintaxe, que é:

Explicação:

xargs – É o comando que recebe os dados da entrada padrão e passa como argumento para outro comando (comando_destino).

opções – São as opções do xargs.

comando_destino – É o comando que será executado pelo xargs.

initial-arguments – São os argumentos que serão fornecidos ao “comando_destino” antes dos argumentos obtidos pelo xargs a partir da entrada padrão.

Quando nenhum “comando_destino” é especificado explicitamente, o xargs executa por padrão o utilitário echo. A tabela a seguir contém algumas das opções utilizadas pelo comando xargs para uma consulta rápida:

OpçãoDescriçãoExemplos de uso
-nLimita a quantidade máxima de argumentos passados para cada chamada do comando.seq 6 | xargs -n 2
-IDefine um marcador para substituir cada entrada.cat files.txt | xargs -I {} cp {} /backup/
-0Usa “NULL” como separador, ideal para nomes com espaços.find . -type f -print0 | xargs -0 rm
-PHabilita a execução paralela rodando até “NUM” processos simultâneos.cat urls.txt | xargs -P 4 -n 1 wget
-tExibe no terminal a linha de comando exata que será executada antes de rodá-la.cat pacotes.txt | xargs -t dnf install

Para aprender mais sobre o comando xargs a seguir tem vários exemplos práticos de uso explicados em detalhes.

Limitando a quantidade de argumentos passados

O comando xargs tenta passar o maior número de argumentos possíveis para o próximo comando, por exemplo ao executar:

O xargs envia para o comando “ls -lh” o máximo de arquivos com a extensão “.log” que conseguir. A opção “-t” imprime a linha de comando que será executada antes da execução.

Para limitar a quantidade de argumentos utilize a opção “-n” seguido do número de argumentos que o xargs passará para o comando, veja o exemplo:

A imagem acima mostra que o comando xargs passa de dois em dois argumentos para o comando “ls”, ou seja, no exemplo a cada dois argumentos é executado novamente o comando “ls -lh”.

Remover múltiplos pacotes de software

Você também pode utilizar o comando xargs para passar como argumento uma lista de pacotes a serem removidos pelo gerenciador de pacotes.

O comando a seguir utilizo em um shell script que tenho para localizar pacotes do libreoffice (instalados manualmente) e remove-los.

Na prática o comando dpkg lista todos os pacotes instalados, essa lista é enviada para o comando grep que filtra pela palavra “libreoffice”.

Em seguida os pacotes com “libreoffice” em seu nome ou descrição são filtrados pelo comando cut para exibir somente o nome do pacote e a lista com os nomes dos pacotes é enviado para o xargs que entrega ao apt, que por sua vez “purge” cada pacote passado como argumento.

Alterar permissões de vários arquivos

Uma outra situação de uso do comando xargs é precisar alterar as permissões de muitos arquivos que estão diretórios diferentes, mas sem precisar executar várias vezes o comando chmod.

Por exemplo, para adicionar a permissão de execução utilizando o comando chmod em shell scripts (arquivos com extensão “.sh“) localizados em diretórios diferentes, dentro do diretório atual, execute o comando:

Na prática o comando find procura recursivamente no diretório corrente por arquivos com extensão “.sh” e a opção “-print0” imprime o nome completo do arquivo na saída padrão, seguido por um caractere nulo (em vez do caractere de nova linha usado pela opção “-print”).

Isso permite que nomes de arquivos contendo caracteres de nova linha ou com espaços em branco sejam interpretados corretamente por programas que processam a saída do find.

Já a opção “-0” do xargs, desativa a string de fim de arquivo, que passa a ser tratada como qualquer outro argumento. Útil quando os itens de entrada podem conter espaços em branco, aspas ou barras invertidas.

A opção “-print0” do comando find gera uma entrada adequada para o comando xargs com a opção “-0”. Assim, vários arquivos (incluindo os que contém espaços em seu nome) podem ser processados em uma única chamada ao chmod.

Criar usuários e senhas a partir de um arquivo “.csv”

Já precisou criar muitas contas de usuários a partir de de um arquivo do tipo “.csv” ? Fica tranquilo(a), pois xargs ajuda também.

O exemplo a seguir, mostra como criar contas de usuários e as respectivas senhas a partir de um arquivo chamado “users.csv”.

A imagem abaixo mostra o conteúdo do arquivo “users.csv” e perceba que existe uma “,” (vírgula) separando a primeira coluna “nome do usuário” da segunda coluna “senha do usuário”:

O comando a seguir primeiro extrai o conteúdo do arquivo “users.csv” utilizando o comando “awk”, o “\t” insere uma tabulação no lugar do caractere “,” (vírgula).

Em seguida o comando “awk” redireciona para entrada padrão do comando xargs os usuários e senhas, e o xargs com “-n2” limita dois argumentos por vez, enviando somente o usuário e sua respectiva senha para o próximo comando (bash).

A opção “-r” faz o xargs não executar o comando se não existir entrada, e o bash executa o comando “samba-tool” (‘samba-tool user create “$1” “$2″‘ _), substituindo “$1” pelo do usuário e “$2” pela senha do usuário.

Criar diretórios que contém espaços no nome a partir de uma lista

Um outro exemplo prático do comando xargs é passar como argumentos uma lista de muitos diretórios, incluindo diretórios com espaço no nome.

Como o xargs, por padrão, considera espaços e quebras de linha como separadores (delimitadores). Então, se seu arquivo tiver:

O xargs interpretará isso como 10 argumentos, e não 5. A solução mais simples é fazer o comando xargs usar como delimitador a quebra de linha, assim, cada diretório ocupa uma linha no arquivo.

E “< diretorios.txt” faz o direcionamento do conteúdo do arquivo “diretorios.txt” para a entrada padrão do comando xargs.

A opção “-d” indica qual delimitador o comando xargs vai utilizar, nesse caso será “\n” que é uma quebra de linha, ou seja, o xargs somente vai considerar um novo argumento o que vêm na linha abaixo, assim, em cada linha os nomes de diretórios com espaços são preservados.

Passando argumentos para múltiplos comandos

O comando xargs é muito poderoso, ao ponto de passar os dados da entrada padrão como argumento para múltiplos comandos. A opção “-I” do comando xargs troca os pares de chaves “{}” pela cadeia que está recebendo pelo “|” PIPE.

No exemplo a seguir, o xargs substitui o par de chaves “{}” pelos nomes dos arquivos executáveis recebidos do comando find, esses arquivos são utilizados como argumentos para os comandos executados pelo bash.

O caractere “\” ao fim de algumas linhas indica ao shell bash que a linha de comando continuará na próxima linha.

Na prática, o bash com a opção “-c”, executa um teste validando se o diretório chamado “copy” existe, se não existir o cria. Caso exista, copia cada um dos arquivos para dentro de “scripts/copy” e em seguida renomeia cada arquivo adicionando uma extensão “.sh” aos arquivos.

Outro exemplo, suponha que tem vários arquivos que contém o ano com quatro dígitos no seu nome:

E você precisa criar um diretório para cada ano e enviar cada arquivo para o diretório do ano certo, exemplo, criar diretório “2025” e enviar para dentro os arquivos que tem “2025” em seu nome, e repetir esse padrão para os outros arquivos.

Podemos extrair o ano do nome de arquivos, criar o diretório correspondente e mover cada arquivo para dentro do diretório correspondente:

O comando acima faz uma busca por arquivos com extensão “.pdf” e envia os arquivos encontrados para o xargs, através da opção “-I” o comando xargs substitui “{}” o par de chaves por cada arquivo e executa o comando bash.

O bash com a opção “-c” executa vários comandos, primeiro cria uma variável que contém o ano extraído do nome do arquivo, variável utilizada pelos comandos “test”, “mkdir” e “mv”, o test (abre e fecha colchetes) testa se o diretório contido na variável existe, já o comando mkdir cria o diretório se ele não existir e o comando mv move cada arquivo para o diretório do ano certo.

Comando xargs passando vários arquivos para compressão

Precisa automatizar a compressão de vários arquivos de logs de uma aplicação ? O comando xargs dá uma ajuda também, passando todos os arquivos de log para o comando que comprime os arquivos.

Veja o exemplo abaixo, que pode ser utilizado em rotinas de gerenciamento de logs. o comando find localiza os arquivos com extensão “.log” e envia através do PIPE para o xargs.

O comando xargs passa o máximo de arquivos como argumentos para o comando gzip que comprime cada um de uma vez. Como já explicado a opção “-0” do xargs e a opção “-print0” do find devem sempre que possível ser utilizadas para lidar com arquivos que contém espaços no nome.

Checando se o nginx está em execução nos servidores

Já precisou automatizar a tarefa de checar se um serviço está em execução utilizando o terminal ? O comando xargs também pode ser usado para automatizar comandos via ssh.

Suponha que o arquivo “servidores.txt” contenha:

Poderia ser, também o endereço IP de cada servidor que tem o serviço web nginx instalado. Para verificar o status do serviço em todos os servidores, execute o comando:

Após o comando “cat” passar a lista de servidores para o xargs, o comando ssh é executado pelo xargs e é passado para o ssh vários comandos, o primeiro imprime uma mensagem “checando o status no servidor” seguido do servidor e o segundo verifica de fato se o serviço nginx está em execução.

Você aprendeu alguns exemplos práticos de uso, para aprofundar o conhecimento sobre todas as opções disponíveis, consulte o manual online do comando xargs.

Conclusão

O comando xargs é um utilitário essencial para quem deseja automatizar tarefas e manipular grande volume de argumentos no terminal.

Minha recomendação é praticar esses comandos em ambientes de testes, antes de colocar em prática qualquer tarefa de automação.

Ficou com alguma dúvida sobre o uso do comando xargs ou tem alguma sugestão de exemplo prático ? Deixe seu comentário abaixo para continuarmos a conversa!

Perguntas Frequentes (FAQ) sobre o comando xargs

Qual a diferença entre o “|” (PIPE) e o xargs ?

O “|” PIPE passa a saída de um comando para entrada padrão (STDIN) do comando seguinte. Já o xargs converte essa entrada em argumentos de linha de comando para o utilitário de destino.

O comando xargs é seguro para excluir arquivos ?

O comando xargs não remove arquivos e diretórios, mas pode ser utilizado em conjunto com comandos como “rm” para remoção de arquivos, mas é necessário testar antes para validar se vai fazer o que deseja.

Qual a diferença entre os comandos find e xargs ?

O comando find é utilizado principalmente para localizar arquivos e diretórios. O xargs recebe uma lista de dados e utiliza-os como argumentos para executar outro comando.

Como consigo tratar nomes de arquivos com espaço no xargs ?

Utilizando a opção “-0” ou “--null” do comando xargs, e ao usar em conjunto com o comando find, para tratar nomes com espaços, utilize a opção “-print0” do find.

Também é possível utilizar a opção “-d” para definir um delimitador diferente, como mostrado no artigo.

Como acelerar a execução do comando xargs em servidores com múltiplos processadores ?

Utilize a opção “-P” [NUM] para definir o número de processos concorrentes que o xargs deve executar simultaneamente, mas deve ser utilizado com cuidado para evitar sobrecarga no servidor.

Navegue por tópicos:

Foto de Edson Oliveira
Edson Oliveira

Especialista em Linux, trabalhando com TI tem experiência no gerenciamento, solução de problemas e suporte de servidores linux em ambientes corporativos.

Professor de cursos voltados a linux, tecnologias open source e certificações LPI. Possui as certificações LPIC-1, LPIC-2 e LPIC-3 (Mixed Environment).

Navegue por tópicos:

Você também pode gostar:

Deixe um comentário

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

Valorizamos sua privacidade

Utilizamos cookies para aprimorar sua experiência de navegação, exibir anúncios ou conteúdo personalizado e analisar nosso tráfego. Ao clicar no botão “Aceitar todos”, você concorda com nosso uso de cookies.

Para mais informações leia nossa Política de Privacidade.