¿Cómo usar expresiones regulares con el comando buscar?

Resuelto thoslin asked hace 13 años • 9 respuestas

Tengo algunas imágenes nombradas con uuid1una cadena generada. Por ejemplo 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Quiero encontrar todas estas imágenes usando findel comando " ":

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

Pero no funciona. ¿Hay algún problema con la expresión regular?

thoslin avatar Jul 27 '11 20:07 thoslin
Aceptado
find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"

Tenga en cuenta que debe especificarlo .*/al principio porque findcoincide con toda la ruta.

Ejemplo:

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$ 
susam@nifty:~/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 de buscar:

$ 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) 
susam@nifty:~/so$ 
susam@nifty:~/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'.
Susam Pal avatar Jul 27 '2011 13:07 Susam Pal

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

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

Si todos estos están directamente en el directorio actual, entonces

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

Deberia trabajar. (No estoy realmente seguro; no puedo hacer que la repetición contada funcione aquí). Puede cambiar a expresiones egrep de la siguiente manera -regextype posix-egrep:

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

(Tenga en cuenta que todo lo que se dice aquí es para búsqueda de GNU, no sé nada sobre BSD, que también es el predeterminado en Mac).

Paŭlo Ebermann avatar Jul 27 '2011 13:07 Paŭlo Ebermann

A juzgar por otras respuestas, parece que esto podría ser culpa del hallazgo.

Sin embargo, puedes hacerlo de esta manera:

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

Es posible que tengas que modificar un poco el grep y usar diferentes opciones según lo que quieras, pero funciona.

yarian avatar Jul 27 '2011 13:07 yarian

en Mac OS X (búsqueda BSD) : el mismo efecto que la respuesta aceptada .

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

man finddice que -Eutiliza soporte extendido para expresiones regulares

NOTA: el .*/prefijo es necesario para que coincida con una ruta completa:

Para fines comparativos, aquí está la versión GNU/Linux:

$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
Stan Kurdziel avatar Aug 31 '2018 23:08 Stan Kurdziel