¿Cómo usar el comando find para encontrar todos los archivos con extensiones de la lista?

179

Necesito encontrar todos los archivos de imagen del directorio (gif, png, jpg, jpeg).

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

¿Cómo modificar esta cadena para encontrar no solo archivos .jpg?

Kirzilla
fuente

Respuestas:

191
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
Pausado hasta nuevo aviso.
fuente
66
No me funciona en Mac, pero funciona con la opción -E (extendida) (¿tal vez la tubería es una característica extendida?): Buscar -E / ruta / a -iregex ". * \. (Jpg | gif | png | jpeg) "> log
ling
138
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

trabajará. Puede haber una forma más elegante.

JoseK
fuente
16
-iname no distingue entre mayúsculas y minúsculas
Chris Koston
1
@Gerald: es probable que necesite agrupar su expresión OR entre paréntesis: de lo find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;contrario, el ejecutivo solo se aplica a la última parte ( -iname '*.jpg' en este caso).
Pausado hasta nuevo aviso.
Esa es una observación importante. find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0solo imprimirá los archivos jpg! Necesita paréntesis aquí:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Anne van Rossum
28

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

Esto le -Eahorra tener que escapar de los parens y las tuberías en su expresión regular.

tboyce12
fuente
2
mi hallazgo no tiene esto -E
wieczorek1990
1
Hmmm, la -Eopción le dice findque use "expresiones regulares extendidas". Varias otras herramientas tienen una opción similar, pero no estoy seguro de que esta opción esté disponible en todas las distribuciones de UNIX.
tboyce12
8
Funciona también en Mac OS.
c.gutierrez
2
@ tboyce12 de Trabajo sobre ubuntu, que puede especificar el -regextype para simplificar la expresión de expresiones regulares: find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
doub1ejack
1
@cjm Quizás find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log. Usar la -iregexbandera le dice findque coincida con mayúsculas y minúsculas sin distinción.
tboyce12
11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

Esto utiliza el filecomando para intentar reconocer el tipo de archivo, independientemente del nombre de archivo (o extensión).

Si /path/too un nombre de archivo contiene la cadena image, entonces lo anterior puede devolver resultados falsos. En ese caso, sugeriría

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
unutbu
fuente
Lo siento, tuve un clic errante allí y aparentemente no puedo deshacer el voto negativo ... :(
Mark Simpson
6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
ghostdog74
fuente
2
¿Podría explicar por qué agregó los paréntesis (escapado) alrededor de los parámetros nombre / iname?
Bart Kleijngeld
¿Alguna razón para la inconsistencia? -iname *.jpg, -o -name *.jpeg, -o -iname *gifTodos tienen un formato ligeramente diferente.
Carro abandonado el
si al menos pudieras explicar las diferencias con otras respuestas.
el-teedee
6

En complemento a la respuesta de @Dennis Williamson anterior, si desea que la misma expresión regular no distinga entre mayúsculas y minúsculas en las extensiones de archivo, use -iregex:

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

En el uso de Mac OS

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

en caso de que los archivos no tengan extensión podemos buscar el tipo de archivo mime

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

donde (audio | video | matroska | mpeg) son tipos mime regex

y si quieres eliminarlos:

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

o eliminar todo lo demás excepto esas extensiones:

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

observe el ~ en lugar de ~

k. Gama
fuente