¿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?

Respuestas:


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

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.


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.


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/

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" \)

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

5

En el uso de Mac OS

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"


-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 ~

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.