2011-07-27 26 views
178

Tengo algunas imágenes nombradas con la cadena uuid1 generada. Por ejemplo 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Quiero encontrar todas estas imágenes con el comando "Buscar":¿Cómo usar la expresión regular con el comando find?

find . -regex "[a-f0-9\-]\{36\}\.jpg". 

Pero no funciona. Algo malo con la expresión regular? ¿Podría alguien ayudarme con esto?

+4

quizás cambie el tipo de regex. El valor predeterminado es * Emacs Regular Expressions *, lo que sea que eso signifique. – pavium

+0

http://stackoverflow.com/questions/5635651/linux-find-regex –

+11

esto no es offtopic. – rutherford

Respuesta

217
find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg" 

Tenga en cuenta que es necesario especificar .*/ al principio porque find partidos todo el camino.

Ejemplo:

su[email protected]:~/so$ find . -name "*.jpg" 
./foo-111.jpg 
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg 
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg 
[email protected]:~/so$ 
[email protected]:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg" 
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg 
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg 

Mi versión del hallazgo:

$ find --version 
find (GNU findutils) 4.4.2 
Copyright (C) 2007 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Written by Eric B. Decker, James Youngman, and Kevin Dalley. 
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b 
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
[email protected]:~/so$ 
[email protected]:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg" 
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'. 
+0

No sé por qué, pero solo esto funciona. ¡Gracias! – thoslin

+0

No sé si esta es solo mi versión, pero me aparece 'find: expresión regular desconocida type sed; los tipos válidos son findutils-default, awk, egrep, emacs, gnu-awk, grep posix-awk, posix-basic, posix-egrep, posix-extended' – yarian

+0

Mi versión es find (GNU findutils) 4.4.2 – thoslin

6

Intenta usar comillas simples (') para evitar el escape de la cadena. Recuerde que la expresión debe coincidir con la ruta completa, es decir, tiene que quedar así:

find . -regex '\./[a-f0-9-]*.jpg' 

Aparte de eso, parece que mi descubrimiento (GNU 4.4.2) sólo conoce expresiones regulares básicas, especialmente no el {36 } sintaxis Creo que tendrás que arreglártelas sin eso.

56

La expresión de búsqueda -regex coincide con el nombre completo, incluida la ruta relativa desde el directorio actual. Para find . esto siempre comienza con ./, luego cualquier directorio.

Además, estas son expresiones regulares emacs, que tienen otras reglas de escape que las expresiones regulares egrep habituales.

Si estos son todos directamente en el directorio actual, entonces

find . -regex '\./[a-f0-9\-]\{36\}\.jpg' 

debería funcionar. (No estoy realmente seguro - no puedo conseguir la repetición contados a trabajar aquí.) Puede cambiar a egrep expresiones por -regextype posix-egrep:

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg' 

(Tenga en cuenta que todo lo dicho aquí es para GNU encontrar, no me 't sabe nada acerca de la BSD, que es la opción por defecto en Mac.)

+1

Tenía paréntesis para múltiples cadenas coincidentes en mi expresión regular, por lo que El tipo 'posix-egrep' funcionó para mí. – palswim

+2

Algo a tener en cuenta, '-regextype' es una opción para GNU' encontrar' y no BSD (al menos no Mac BSD-like) 'find'. Si esta opción no está disponible, asegúrese de instalar GNU find. Si en una Mac es posible con el paquete de preparación 'findutils'. Find está disponible a través de 'gfind'. – DanCat

23

A juzgar por otras respuestas, parece que esto podría ser de inculpa.

Sin embargo, puede hacerlo de esta manera en su lugar:

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

Es posible que tenga que ajustar el grep un poco y utilizar diferentes opciones dependiendo de lo que desee, pero funciona.

+0

funcionó bien para mí y proporciona un gran grado de libertad con respecto a la expresión regular. – glaucon

+1

Una desventaja de esto es que no se puede aprovechar la funcionalidad '-prune' de' find' que saltará por completo a ciertos directorios. La mayoría de las veces esto no es realmente importante, pero vale la pena mencionarlo. –

6

Debe usar la ruta absoluta del directorio cuando aplique la instrucción find con expresión regular. En el ejemplo, el

find . -regex "[a-f0-9\-]\{36\}\.jpg" 

se debe cambiar en

find . -regex "./[a-f0-9\-]\{36\}\.jpg" 

En la mayoría de los sistemas Linux, algunas disciplinas en la expresión regular no puede ser reconocida por ese sistema, así que hay que señalar explícitamente -regexty como

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg" 
Cuestiones relacionadas