Posso obter todas as jpg
imagens usando:
find . -name "*.jpg"
Mas como posso adicionar png
arquivos aos resultados também?
Comentários
Resposta
Use o sinalizador -o
entre parâmetros diferentes.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
funciona perfeitamente.
NOTA Deve haver um espaço entre o colchete e seu conteúdo ou não funcionará.
Explicação:
-
-type f
– pesquise apenas arquivos (não diretórios) -
\(
&\)
– são necessários para que-type f
se apliquem a todos os argumentos -
-o
– OU lógico operador -
-iname
– como-name
, mas a correspondência não diferencia maiúsculas de minúsculas
Comentários
- Você precisa dos parênteses? O comando funciona para mim sem eles. Eles são necessários para alguns shells?
- @miked O comando " funcionará " sem eles, sim, mas você ' d acaba obtendo acessos em diretórios que terminam em .png, bem como em arquivos que terminam em .jpg, o que não é exatamente o que se pretendia.
- Agradeço por ter esclarecido! O
type -f
não se estende nem se aplica a ambas as expressões sem os parênteses. Portanto,find ./ -type f -iname \*.jpg -o -type f -iname \*.png
também funciona … embora ' s dois caracteres a mais 🙂 - É ' uma questão de precedência do operador. Assim como
a * b + c
é diferente dea * (b + c)
- @jdhao Boa captura, corrigida.
Resposta
Você pode combinar critérios com -o
como sugerido por Shadur . Observe que -o
tem precedência menor do 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 use -regex
para combinar extensões de uma maneira mais concisa. A sintaxe padrão do regexp é Emacs ( regexps básicos mais algumas extensões como \|
para alternância); existe uma opção para mudar para expressões regulares estendidas .
find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)"
No FreeBSD, NetBSD e OSX, você pode usar -regex
combinado com -E
para expressões regulares estendidas.
find -E . -regex ".*\.(jpg|png)"
Comentários
- É ' é sempre melhor usar
-iname
em vez de-name
– então você também irá capturarimage.JPG
eimage.PnG
Resposta
Isso é mais correto:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Comentários
- Por que você diz que é " mais " correto?
- @Kevin Acho que porque
-iregex
corresponde ajpg
e também aJPG Jpg jpG
e tal. Acho que$
não ' é necessário . - Isso funciona bem em MinGW .
- Primeiro, você omitiu a pasta de pesquisa como primeiro argumento que lançará um erro. Em segundo lugar, no OSX, o escape do parêntese não funcionará e deve ser usado:
find -E . -iregex '.*\.(jpg|png|gif)'
como mostrado na resposta de @sorin '.
Resposta
Para deixar claro, a única opção que funciona no tipo 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.
Comentários
- O sinalizador -E não é válido para localização no Ubuntu 14.04
- O sinalizador -E não é válido em MinGW (pelo menos a versão / configuração que experimentei (configuração padrão para uma versão específica)).
- Qual parte de
-type f \( -iname \*.png -o -iname \*.jpg\)
não funciona em OSX? - Pode confirmar que
-type f \( -iname \*.png -o -iname \*.jpg\)
funciona em OSX
Resposta
/\.(jpe?g|png|gif|bmp)$/i;
Use.
Comentário s
- Você pode precisar explicar isso um pouco.
find -name
padrão que corresponde a vários padrões em POR ISSOfind . | egrep '.jpg|.png'
muito.