Como usar o comando find para encontrar todos os arquivos com extensões da lista?

179

Preciso encontrar todos os arquivos de imagem do diretório (gif, png, jpg, jpeg).

find /path/to/ -name "*.jpg" > log

Como modificar essa seqüência de caracteres para encontrar não apenas arquivos .jpg?

Kirzilla
fonte

Respostas:

191
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
Pausado até novo aviso.
fonte
6
Não funciona para mim no mac, mas funciona com a opção -E (estendida) (talvez o pipe seja um recurso estendido?): Encontre -E / path / to -iregex ". * \. (Jpg | gif | png | jpeg) "> log
ling
138
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

vai funcionar. Pode haver uma maneira mais elegante.

JoseK
fonte
16
-iname seria insensível caso
Chris Koston
1
@Gerald: É provável que você precise agrupar sua expressão OR entre parênteses escapados: find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;caso contrário, o exec se aplica apenas à última parte ( -iname '*.jpg' neste caso).
Pausado até novo aviso.
Essa é uma observação importante. find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0imprimirá apenas os arquivos jpg! Você precisa de colchetes aqui:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Anne van Rossum
28

find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log

A -Epoupa de ter que escapar os parênteses e tubos em seu regex.

tboyce12
fonte
2
meu achado não tem esta -E
wieczorek1990
1
Hmmm, a -Eopção diz findpara usar "expressões regulares estendidas". Várias outras ferramentas têm uma opção semelhante, mas não tenho certeza se esta opção está disponível em todas as distribuições UNIX.
precisa saber é o seguinte
8
Também funciona no Mac OS.
c.gutierrez
2
@ tboyce12 Trabalho sobre ubuntu, posso especificar o -regextype para simplificar a expressão regex: find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
Duvida # 23115
1
@cjm Talvez find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log. O uso da -iregexbandeira informa findpara corresponder maiúsculas de minúsculas.
tboyce12
11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

Isso usa o filecomando para tentar reconhecer o tipo de arquivo, independentemente do nome do arquivo (ou extensão).

Se /path/toou um nome de arquivo contiver a string image, o item acima pode retornar resultados falsos. Nesse caso, eu sugiro

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
unutbu
fonte
Desculpe, tinha um clique errante lá e eu, aparentemente, não pode desfazer a downvote ... :(
Mark Simpson
6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
ghostdog74
fonte
2
Você poderia explicar por que adicionou os parênteses (escapados) ao redor dos parâmetros nome / nome?
Bart Kleijngeld
Alguma razão para a inconsistência? -iname *.jpg, -o -name *.jpeg, -o -iname *gifTodos têm um formato ligeiramente diferente.
Carrinho abandonado
se você pudesse pelo menos explicar as diferenças com outras respostas.
El-teedee
6

Em complemento à resposta de @Dennis Williamson acima, se você deseja que o mesmo regex não diferencie maiúsculas de minúsculas das extensões de arquivo, use -iregex:

find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
TCW
fonte
5

No Mac OS, use

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"
7ynk3r
fonte
3
find -regex ".*\.\(jpg\|gif\|png\|jpeg\)"
estridente
fonte
-1

caso os arquivos não tenham extensão, podemos procurar o tipo mime

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'

onde (audio | video | matroska | mpeg) são tipos mime regex

e se você quiser excluí-los:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

ou exclua tudo, menos essas extensões:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

observe o! ~ em vez de ~

k) Corça
fonte