Linux slogan
Visite também: BR-Linux.org · Dicas-L · NoticiasLinux · SoftwareLivre.org · UnderLinux · BestLinux



» Screenshot
Linux: Xbox Linux BOOT
Por vicklemos
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha

» Wallpaper

Dica

Dupla diabólica: find e xargs
Linux user
Publicado por Jivago J. Alves em 07/07/2008

Login: jivagoalves, 7749 pontos Homepage: http://jivagoalves.blogspot.com
[ Hits: 2078 ]

Dupla diabólica: find e xargs

Hoje veremos uma dupla considerada diabólica no shell, se utilizada sem a devida atenção: o find e o xargs.

O find, como o nome diz, é utilizado para se encontrar arquivos no sistema. Já o xargs facilita a repetição de um certo comando para cada entrada fornecida para ele. Peraí, vamos entender melhor. Considere que eu queira apagar os arquivos terminados em ~ no diretório atual. Poderíamos utilizar a dupla da seguinte maneira:

$ find . -name "*~" | xargs rm

Aqui o find retornaria uma saída com os arquivos terminados em ~ e o xargs executaria o comando rm para cada uma das saídas.

Por exemplo, crie um diretório teste e entre nele:

$ mkdir teste; cd teste

Agora crie os arquivos "teste" e "teste~":

$ > teste; > teste~
$ ls

teste teste~

Agora vamos apagar os arquivos terminados em ~ do diretório atual:

$ find . -name "*~" | xargs rm
$ ls

teste

Olha aí o resultado acima, deu certo.

Até aí tudo bem, mas se o arquivos terminados em ~ possuíssem caracteres em branco? Experimente e crie um "teste 1~". Proteja-o com aspas para que o shell não interprete mal o que queremos:

$ > "teste 1~"
$ ls

teste teste 1~

Agora experimente apagá-lo com:

$ find . -name "*~" | xargs rm
rm: impossível remover `1~': Arquivo ou diretório inexistente

$ ls
teste 1~


E agora, José? Cadê meu arquivo "teste"? Ele APAGOU O ARQUIVO ERRADO!

Isso aconteceu simplesmente porque o rm tratou o arquivo "teste 1~" como dois arquivos diferentes: um "teste" e outro "1~". Ou seja, o espaço em branco acabou com nossa alegria (e talvez o emprego)!

Mas não se apavore, pois uma solução pra isso é utilizar a opção -print0 do find junto com a opção -0 do xargs.

$ > teste
$ ls

teste teste 1~

$ find . -name "*~" -print0 | xargs -0 rm
$ ls

teste

Pronto, agora sim, funcionou! A explicação é que o find separou os arquivos com um caractere nulo. O xargs interpretou os caracteres nulos como separadores dos arquivos e fez o que queríamos. :]

Para mais informações:

$ man find
$ man xargs


Referências:

Outras dicas deste autor

Leitura recomendada
   Dica Linux recomendada Configurando Wireless Atheros AR5212 no Fedora 4
   Dica Linux recomendada Ajustar a data do sistema
   Dica Linux recomendada Gerenciando log do Oracle através do Linux com Logrotate
   Dica Linux recomendada Descobrindo nome do host a partir de um IP
   Dica Linux recomendada Virtualização de sistemas operacionais com o Sun xVM VirtualBox

Comentários
[1] Comentário enviado por maran em 07/07/2008 - 17:00h:

ótima dica, parábens.


Contribuir com comentário
  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Copyleft© 2002-2009 Viva o Linux.com.br

Viva o Linux

A maior comunidade Linux do Brasil! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.