O comando xargs
Por Júlio Neves
Data de Publicação: 26 de Fevereiro de 2007
Existe um comando, cuja função primordial é construir listas de parâmetros e passá-la para a execução de outros programas ou instruções. Este comando é o xargs e deve ser usado da seguinte maneira:
xargs [comando [argumento inicial]]
Caso o comando, que pode ser inclusive um script Shell, seja omitido, será usado por default o echo.
O xargs combina o argumento inicial com os argumentos recebidos da entrada padrão, de forma a executar o comando especificado uma ou mais vezes.
Exemplo:
Vamos produrar em todos os arquivos abaixo de um determinado diretório uma cadeia de caracteres usando o comando find com a opção type f para pesquisar somente os arquivos normais, desprezando diretórios, arquivos especiais, arquivos de ligações, etc, e vamos torná-la mais genérica recebendo o nome do diretório inicial e a cadeia a ser pesquisada como parâmetros. Para isso fazemos:
$ cat grepr # # Grep recursivo # Pesquisa a cadeia de caracteres definida em $2 a partir do diretorio $1 # find $1 -type f -print|xargs grep -l "$2"
Na execução deste script procuramos, a partir do diretório definido na variável $1, todos os arquivos que continham a cadeia definida na variável $2.
Exatamente a mesma coisa poderia ser feito se a linha do programa fosse a seguinte:
find $1 -type f -exec grep -l "$2" {} \;
Este processo tem duas grandes desvantagens sobre o anterior:
- A primeira é bastante visível: o tempo de execução deste método é muito superior ao daquele, isso porque o grep será feito em cada arquivo que lhe for passado pelo find, um-a-um, ao passo que com o xargs, será passada toda, ou na pior das hipóteses, a maior parte possível, da lista de arquivos gerada pelo find;
- Dependendo da quantidade de arquivos encontrados que atendem ao find, poderemos ganhar aquela famosa e fatídica mensagem de erro "Too many arguments" indicando um estouro da pilha de execução do grep. Como foi dito no item anterior, se usarmos o xargs ele passará para o grep a maior quantidade de parâmetros possível, suficiente para não causar este erro, e caso necessário executará o grep mais de uma vez.
ATENÇÃO! Aê pessoal do linux que usa o ls colorido que nem porta de tinturaria: nos exemplos a seguir que envolvem esta instrução, você devem usar a opção --color=none, senão existem grandes chances dos resultados não ocorrerem como o esperado.
Vamos agora analisar um exemplo que é mais ou menos o inverso deste que acabamos de ver. Desta vez, vamos fazer um script para remover todos os arquivos do diretório corrente, pertencentes a um determinado usuário.
A primeira idéia que surge é, como no caso anterior, usar um comando find, da seguinte maneira:
$ find . -user cara -exec rm -f {} \;
Quase estaria certo, o problema é que desta forma você removeria não só os arquivos do cara no diretório corrente, mas também de todos os outros subdiretórios "pendurados" neste. Vejamos então como fazer:
$ ls -l | grep " cara " | cut -c55- | xargs rm
Desta forma, o grep selecionou os arquivos que continham a cadeia cara no diretório corrente listado pelo ls -l. O comando cut pegou somente o nome dos arquivos, passando-os para a remoção pelo rm usando o comando xargs como ponte.
Duvidas? julio.neves@gmail.com Deseja fazer curso de Programação em Shell? julio.neves@tecnohall.com.br
Conheça também o livro de Programação Shell de Júlio Neves
Conheça também um curso completo e gratuito de programação Shell em www.julioneves.com
Este tutorial foi publicado originalmente na Dicas-L em 26 de fevereiro de 2005
Veja a relação completa dos artigos da coluna Cantinho do Shell
Para se manter atualizado sobre as novidades desta coluna, consulte sempre o newsfeed RSS
Para saber mais sobre RSS, leia o artigo O Padrão RSS - A luz no fim do túnel.
Opinião dos Leitores
26 Fev 2007, 19:45
É mesmo um comando MUITO util!
Possui inumeras opcoes mas uma que vale
a pena citar é a opcao -i.
Por padrao o xargs monta a lista de
parametros no *final* do comando.
ex:
ls -l | xargs <comando> <opcoes>
Nesse exemplo o xargs "apenda" a lista
de parametros no final, e se precisarmos
da lista de parametros no meio do comando? Aí sim usamos o -i.
find . -type f -name '*.txt'| xargs
-istr cp str /tmp/
isso copia todos os arquivos filtrados pelo find do diretorio corrente para /tmp, assuminto que nao existem dois arquivos com nome igual em nenhuma subpasta.
o que a opcao -i faz é substituir a
sequencia "str" ( ou outra escolhida
pelo usuario) pela lista de parametros
montada pelo xargs, assim podemos
posicionar nossa lista em qualquer
lugar no comando final.
Uso isso sempre e é bastante util!
Parabens pela dica!
[]'s
Dalton;
PS:
$ xargs --version
GNU xargs version 4.1.7



