Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Slackware 13.1 com Xfce
Por removido
» Login
Login:
Senha:

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

Esqueci minha senha


Dica

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

Login: jivagoalves, 20407 pontos | Blog: http://jivagoalves.blogspot.com
[ Hits: 8870 ]

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 NeoGeo no Linux
   Dica Linux recomendada Sempre e poderoso cat
   Dica Linux recomendada Efeitos do desktop 3D no Ubuntu 7.04
   Dica Linux recomendada Cursos Grátis com selo Intel
   Dica Linux recomendada Wget - ótimo utilitário de downloads

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

ótima dica, parábens.

[2] Comentário enviado por dibetao em 23/08/2011 - 11:51h:

gostei!!

[3] Comentário enviado por andersonvom em 23/08/2011 - 12:06h:

Excelente dica!
Uma outra solucao é remover os arquivos diretamente com o find:

$ > teste ; > "teste 1~"
$ ls
teste teste 1~
$ find . -name '*~' -exec rm -rf {} \;
$ ls
teste
$



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 - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.