De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Semana do Júlio Neves - mais xargs
Colaboração: Júlio Neves
Data de Publicação: 27 de Fevereiro de 2005
Continuamos hoje o que começamos ontem, isto é, a ver as
facilidades oferecidas pelo comando xargs.
O xargs é também uma excelente ferramenta de criação de
one-liners (scripts de somente uma linha). Veja este para
listar todos os donos de arquivos (inclusive seus links)
"pendurados" no diretório /bin e seus subdiretórios.
$ find /bin -type f -follow | \
xargs ls -al | tr -s ' ' | cut -f3 -d' ' | sort -u
Muitas vezes o /bin é um link (se não me engano, no Solaris o
é) e a opção -follows obriga o find a seguir o link. O comando
xargs alimenta o ls -al e a seqüência de comandos seguinte é
para pegar somente o 3º campo (dono) e classificá-lo devolvendo
somente uma vez cada dono (opção -u do comando sort).
Você pode usar as opções do xargs para construir comandos
extremamente poderosos. Para exemplificar isso e começar a
entender as principais opções desta instrução, vamos supor
que temos que remover todos as arquivos com extensão .txt sob
o diretório corrente e apresentar os seus nomes na tela. Veja
o que podemos fazer:
$ find . -type f -name "*.txt" | \
xargs -i bash -c "echo removendo {}; rm {}"
A opção -i do xargs troca pares de chaves ({}) pela cadeia
que está recebendo pelo pipe (|). Então neste caso as chaves
({}) serão trocadas pelos nomes dos arquivos que satifaçam ao
comando find.
Olha só a brincadeira que vamos fazer com o xargs:
$ ls | xargs echo > arq.ls
$ cat arq.ls
arq.ls arq1 arq2 arq3
$ cat arq.ls | xargs -n1
arq.ls
arq1
arq2
arq3
Quando mandamos a saída do ls para o arquivo usando o xargs,
comprovamos o que foi dito anteriormente, isto é, o xargs manda
tudo que é possível (o suficiente para não gerar um estouro
de pilha) de uma só vez. Em seguida, usamos a opção -n 1 para
listar um por vez. Só para dar certeza veja o exemplo a seguir,
quando listaremos dois em cada linha:
$ cat arq.ls | xargs -n 2
arq.ls arq1
arq2 arq3
Mas a linha acima poderia (e deveria) ser escrita sem o uso
de pipe (|), da seguinte forma:
$ xargs -n 2 < arq.ls
Outra opção legal do xargs é a -p, na qual o xargs pergunta
se você realmente deseja executar o comando. Digamos que em
um diretório você tenha arquivo com a extensão .bug e .ok,
os .bug estão com problemas que após corrigidos são salvos
como .ok. Dá uma olhadinha na listagem deste diretório:
$ ls dir
arq1.bug
arq1.ok
arq2.bug
arq2.ok
...
arq9.bug
arq9.ok
Para comparar os arquivos bons com os defeituosos, fazemos:
$ ls | xargs -p -n2 diff -c
diff -c arq1.bug arq1.ok ?...y
....
diff -c arq9.bug arq9.ok ?...y
Para finalizar, o xargs também tem a opção -t, onde vai
mostrando as instruções que montou antes de executá-las. Gosto
muito desta opção para ajudar a depurar o comando que foi
montado.
Então podemos resumir o comando de acordo com a tabela a seguir:
Opção Ação
-i Substitui o par de chaves ({}) pelas cadeias recebidas
-nNum Manda o máximo de parâmetros recebidos, até o máximo de Num para o comando a ser executado
-lNum Manda o máximo de linhas recebidas, até o máximo de Num para o comando a ser executado
-p Mostra a linha de comando montada e pergunta se deseja executá-la
-t Mostra a linha de comando montada antes de executá-la
Acabou! Foi bom para mim, foi bom para você também? :)
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 http://www.temporeal.com.br/produtos.php? >>id=170321&rnd=1564]