Como usar o comando find para procurar por várias extensões

103

Eu posso obter todas as jpg images usando:

find . -name "*.jpg"  

Mas como adicionar arquivos png aos resultados também?

    
por wong2 20.06.2011 / 17:06

5 respostas

125

Use o sinalizador -o entre diferentes parâmetros.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) funciona como um encanto.

OBSERVAÇÃO deve ser um espaço entre o colchete e seu conteúdo ou não funcionará.

Explicação:

  • type -f - procura apenas arquivos (não diretórios)
  • \( - necessário para o type -f se aplicar a todos os argumentos
  • -o - operador OR lógico
  • -iname - como -name , mas a correspondência não faz distinção entre maiúsculas e minúsculas
por 20.06.2011 / 17:11
75

Você pode combinar critérios com -o como sugerido pelo Shadur . Note que -o tem precedência menor que a justaposição, então você pode precisar de parênteses.

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

No Linux, você pode usar -regex para combinar extensões de maneira terser. A sintaxe de regexp padrão é Emacs ( regexps básicos , além de algumas extensões, como \| para alternação); há uma opção para alternar para extensões regulares .

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

No FreeBSD, NetBSD e OSX, você pode usar -regex combinado com -E para regexps estendidos.

find -E . -regex '.*\.(jpg|png)'
    
por 20.06.2011 / 23:29
34

Isso é mais correto.

find -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
    
por 17.11.2012 / 04:20
6

Para deixar claro, o único optio que funciona no Linux, Unix e OS X é:

find -E . -regex '.*\.(jpg|png)'

Isso porque a versão do OS X é um pouco diferente, mas é importante escrever coisas que correm bem na maioria das plataformas.

    
por 21.07.2013 / 16:08
-3
/\.(jpe?g|png|gif|bmp)$/i;

Use-o.

    
por 15.01.2016 / 08:00