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

Respostas:

153

Use a -obandeira entre diferentes parâmetros.

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

NOTA Não deve haver um espaço entre o suporte e seu conteúdo ou não vai funcionar.

Explicação:

  • type -f - procure apenas arquivos (não diretórios)
  • \(- necessário para type -faplicar a todos os argumentos
  • -o - operador OR lógico
  • -iname- tipo -name, mas a correspondência não diferencia maiúsculas de minúsculas
Shadur
fonte
Você precisa dos parênteses. O comando funciona para mim sem eles. Eles são necessários para algumas conchas?
MikeD
2
@miked O comando "funcionará" sem eles, sim, mas você acabaria recebendo hits em diretórios que terminam em .png, bem como em arquivos que terminam em .jpg, que não é exatamente o que foi planejado.
Shadur 19/03/19
1
Obrigado por esclarecer! A type -fnão se estende e se aplicam a ambas as expressões sem os parênteses, assim, find ./ -type f -iname \*.jpg -o -type f -iname \*.pngtambém funciona ... embora seja dois caracteres mais :-)
MikeD
2
É uma questão de precedência do operador. Assim como a * b + cé diferente dea * (b + c)
Shadur
2
@jdhao Boa captura, alterada.
Shadur
86

Você pode combinar critérios com -ocomo sugerido por Shadur . Observe que a -oprecedência é menor que a justaposição; portanto, 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 -regexpara combinar extensões de uma maneira terser. A sintaxe padrão do regexp é o Emacs ( regexps básicos mais algumas extensões, como \|por alternância); existe uma opção para mudar para regexps estendidos .

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

No FreeBSD, NetBSD e OSX, você pode usar -regexcombinado com -Eregexps estendidos.

find -E . -regex '.*\.(jpg|png)'
Gilles
fonte
É sempre melhor usar -inameem vez de -name- então você também irá capturar image.JPGeimage.PnG
ccpizza
40

Isso é mais correto:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
Dimitry
fonte
10
Por que você diz que é "mais" correto?
Kevin
2
@ Kevin eu acho, porque -iregexcombina jpgbem JPG Jpg jpGe tal. Eu acho que $não é necessário.
19--15
Isso funciona bem no MinGW .
Peter Mortensen
2
Primeiro, você omitiu a pasta de pesquisa como primeiro argumento, o que gerará um erro. Em segundo lugar, no OSX, o escape entre parênteses não funcionará, e isso deve ser usado: find -E . -iregex '.*\.(jpg|png|gif)'como mostrado na resposta de @ sorin.
Ccpizza 11/11
8

Para deixar claro, a única opção que funciona no Linux, Unix e macOS é:

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

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

sorin
fonte
2
-E flag não é válida para encontrar no Ubuntu 14.04
gogaman
O sinalizador -E também não é válido no MinGW (pelo menos a versão / configuração em que eu tentei (configuração padrão para uma versão específica)).
Peter Mortensen
Qual parte do -type f \( -iname \*.png -o -iname \*.jpg\)não funciona no OSX?
Shadur
-3
/\.(jpe?g|png|gif|bmp)$/i;

Use-o.

rohit gour
fonte
5
Você pode precisar explicar um pouco isso.
caos