Comando find: busca com dois ou mais nomes (opção -prune)

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

8 interações sobre “Comando find: busca com dois ou mais nomes (opção -prune)

    1. 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…

  1. 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?

    1. 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…!

    1. Interessante. Não tinha testado desta forma. Simplificou muito o uso. Muito obrigado pela contribuição Carlos.

      Obrigado pela visita ao blog.

  2. 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.

    1. 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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Retype the CAPTCHA code from the image
Change the CAPTCHA codeSpeak the CAPTCHA code