Cómo usar el comando find para buscar múltiples extensiones


Respuestas:


153

Use la -obandera entre diferentes parámetros.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) Funciona de maravilla.

NOTA No debe haber un espacio entre el soporte y su contenido o no va a funcionar.

Explicación:

  • type -f - solo busca archivos (no directorios)
  • \(- necesario para type -fque se aplique a todos los argumentos
  • -o - operador lógico OR
  • -iname- como -name, pero el partido no distingue entre mayúsculas y minúsculas

¿Necesitas los paréntesis? El comando funciona para mí sin ellos. ¿Son necesarios para algunas conchas?
MikeD

2
@miked El comando "funcionará" sin ellos, sí, pero terminaría recibiendo visitas en directorios que terminan en .png, así como en archivos que terminan en .jpg, que no es exactamente lo que se pretendía.
Shadur

1
¡Gracias por aclararlo! El type -fno se extiende y se aplica a ambas expresiones sin paréntesis, por lo tanto, find ./ -type f -iname \*.jpg -o -type f -iname \*.pngtambién funciona ... aunque son dos caracteres más largos :-)
MikeD

2
Es una cuestión de precedencia del operador. Al igual que a * b + ces diferente dea * (b + c)
Shadur

2
@jdhao Buena captura, enmendada.
Shadur

86

Puede combinar criterios -osegún lo sugerido por Shadur . Tenga en cuenta que -otiene una precedencia menor que la yuxtaposición, por lo que puede necesitar 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 usar -regexpara combinar extensiones de una manera más tersa. La sintaxis regexp predeterminada es Emacs ( expresiones regulares básicas más algunas extensiones como la \|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 -regexcombinado con -Eexpresiones regulares extendidas.

find -E . -regex '.*\.(jpg|png)'

Siempre es mejor usar en -inamelugar de -name- luego también capturará image.JPGyimage.PnG
ccpizza

40

Esto es más correcto:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'

10
¿Por qué dices que es "más" correcto?
Kevin

2
@Kevin, supongo porque -iregexcoincide jpgtanto como JPG Jpg jpGy tal. Creo que $no se necesita.
ott--

Esto funciona bien en MinGW .
Peter Mortensen

2
Primero, omitió la carpeta de búsqueda como primer argumento que arrojará un error. En segundo lugar, en OSX escapar el paréntesis no funcionará, y esto debería usarse en su lugar: find -E . -iregex '.*\.(jpg|png|gif)'como se muestra en la respuesta de @ sorin.
ccpizza

8

Para que quede claro, la única opción que funciona en Linux, Unix y MacOS es:

find -E . -regex '.*\.(jpg|png)'

Esto se debe a que la versión de OS X es un poco diferente, pero es importante escribir cosas que funcionen bien en la mayoría de las plataformas.


2
-E flag no es válido para buscar en Ubuntu 14.04
gogaman

El distintivo -E tampoco es válido en MinGW (al menos la versión / configuración en la que lo probé (configuración predeterminada para una versión en particular)).
Peter Mortensen

¿Qué parte de -type f \( -iname \*.png -o -iname \*.jpg\)no funciona en OSX?
Shadur

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.