Dica rápida…
Sempre precisei deste recurso. Realizar uma busca com o find passando como parâmetro mais de uma expressão para filtrar nomes de arquivos. Hoje precisei de tal recurso, como tantas outras vezes e decidi “descobrir um jeito…”.
Para podermos realizar uma busca por arquivos que possuem txt e doc em seus nomes parece simples de início… Mas me custou algum tempo de pesquisa. Para tal tarefa podemos usar a opção -prune -o para passar um segundo filtro -name na mesma linha de comando. Segue exemplo:
[root@vostrolab2 tmp]# touch arquivo{1,2,3,4}.doc
[root@vostrolab2 tmp]# touch arquivo{1,2,3,4}.txt
[root@vostrolab2 tmp]# find . -type f -name “*.txt” -prune -o -name “*.doc”
./arquivo3.txt
./arquivo2.doc
./arquivo1.txt
./arquivo3.doc
./arquivo4.doc
./arquivo2.txt
./arquivo4.txt
./arquivo1.doc
[root@vostrolab2 tmp]#
Caso contrário, teríamos que efetuar a busca por *.txt e somente depois executar para *.doc… Este recurso pode ser usado para outros filtros, como -type, -maxdepth, etc etc
Abraços…
Por: Franklin Moretti
referências:
Por Wayne Pollock (08/03/2010)
http://content.hccfl.edu/pollock/unix/findcmd.htm
Antes de conhecer essa, eu usava assim:
$ find . | grep -i -e “.doc” -e “.txt” -e “.whatelse”
Mas é bom conhecer os recursos do próprio find. Ótimo post.
Valeu Frank!!
Sim, eu também.. porém, ele varrerá todo o path, vai inventariar tudo, para depois filtrar… Creio que o o tempo e consumo de recurso seja maior… Esta solução do Find é TOP para shell scripts devido a otimização do uso de recursos para concluir a busca..
vlw…
Dúvida de leigo: senpre uso o locate pra busca, que por buscar na base de dados tem a pesquisa mais rápida. Qual a melhor forma de fazer isso usando o locate?
Então, basicamente seria:
locate * |grep -e “.doc” -e “.txt”
Diferente do find, a busca do locate é em uma base, conforme comentastes.. Porém, a listagem de TUDO existente na base é bem mais rápida que fazer isso como find, que “varre o disco”. Logo esta solução acima cai bem, lembrando sempre que dever ter tua base /var/lib/mlocate/mlocate.db devidamente atualizada (su – root -c “updatedb”) antes de efetuar a busca…
Abraços…!
bom eu sempre usei sem o -prune e sempre funcionou
Exemplo
find . -iname “*log” -o -iname “*conf”
Interessante. Não tinha testado desta forma. Simplificou muito o uso. Muito obrigado pela contribuição Carlos.
Obrigado pela visita ao blog.
Uso a opção -prune para excluir diretórios da pesquisa.
find . -type d -name subdir -prune \
-o -name “[a-z]” -print
Isso irá listar os nomes dos diretórios que estão sob o diretório corrente exceto o subdir. Se existir algum arquivo cujo nome só tenha uma letra, será impresso tb.
Grande mestre Julio Neves!
Que honra tê-lo aqui nos comentários. Mais uma excelente dica-l aqui, muito obrigado!
Pai do shell, quanto já aprendi com seu conteúdo!! Vida longa ao mestre.