Puedo obtener todas las jpg
imágenes usando:
find . -name "*.jpg"
Pero, ¿cómo puedo agregar png
también a los resultados?
Comentarios
Responder
Utilice el indicador -o
entre diferentes parámetros.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
funciona a la perfección.
NOTA Debe haber un espacio entre el corchete y su contenido o no funcionará.
Explicación:
-
-type f
– solo busca archivos (no directorios) -
\(
&\)
– son necesarios para que-type f
se aplique a todos los argumentos -
-o
– OR lógico operador -
-iname
– como-name
, pero la coincidencia no distingue entre mayúsculas y minúsculas
Comentarios
- ¿Necesita los paréntesis? El comando funciona para mí sin ellos. ¿Son necesarios para algunos shells?
- @miked El comando " funcionará " sin ellos, sí, pero usted ' d termina obteniendo resultados en directorios que terminan en .png así como en archivos que terminan en .jpg, que no es exactamente lo que se pretendía.
- ¡Gracias por aclararlo! El
type -f
no se extiende ni se aplica a ambas expresiones sin los paréntesis. Por lo tanto,find ./ -type f -iname \*.jpg -o -type f -iname \*.png
también funciona … aunque ' s dos caracteres más largos 🙂 - Es ' una cuestión de precedencia del operador. Al igual que
a * b + c
es diferente dea * (b + c)
- @jdhao Buena captura, modificada.
Respuesta
Puede combinar criterios con -o
como sugerido por Shadur . Tenga en cuenta que -o
tiene una precedencia menor que la yuxtaposición, por lo que es posible que necesite paréntesis.
find . -name "*.jpg" -o -name "*.png" find . -mtime -7 \( "*.jpg" -o -name "*.png" \) # all .jpg or .png images modified in the past week
En Linux, puede use -regex
para combinar extensiones de una manera más tersa. La sintaxis de expresiones regulares predeterminada es Emacs ( expresiones regulares básicas más algunas extensiones como \|
para alternancia); hay una opción para cambiar a expresiones regulares extendidas .
find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)"
En FreeBSD, NetBSD y OSX, puede usar -regex
combinado con -E
para expresiones regulares extendidas.
find -E . -regex ".*\.(jpg|png)"
Comentarios
- Es ' siempre mejor usar
-iname
en lugar de-name
, entonces también capturaráimage.JPG
yimage.PnG
Respuesta
Esto es más correcto:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Comentarios
- ¿Por qué dices que es " más " correcto?
- @Kevin Supongo que porque
-iregex
coincide conjpg
y conJPG Jpg jpG
y demás. Creo que$
no es ' necesario . - Esto funciona bien en MinGW .
- Primero, omitió la carpeta de búsqueda como primer argumento que arrojará un error. En segundo lugar, en OSX, el escape del paréntesis no funcionará, y esto debe usarse en su lugar:
find -E . -iregex '.*\.(jpg|png|gif)'
como se muestra en la respuesta de @sorin '.
Respuesta
Para que quede claro, la única opción que funciona en Linux, Unix y macOS es:
find -E . -regex ".*\.(jpg|png)"
Eso se debe a que la versión de OS X es un poco diferente, pero eso es importante para escribir cosas que funcionen bien en la mayoría de las plataformas.
Comentarios
- El indicador -E no es válido para buscar en Ubuntu 14.04
- El indicador -E no es válido en MinGW tampoco (al menos la versión / configuración en la que lo probé (configuración predeterminada para una versión en particular)).
- Qué parte de
-type f \( -iname \*.png -o -iname \*.jpg\)
no funciona en OSX? - Puede confirmar que
-type f \( -iname \*.png -o -iname \*.jpg\)
funciona en OSX
Responder
/\.(jpe?g|png|gif|bmp)$/i;
Úselo.
Comentar s
- Es posible que deba explicar esto un poco.
find -name
patrón que coincide con varios patrones en SOfind . | egrep '.jpg|.png'
mucho.