¿Cómo usar regex con el comando find?

Tengo algunas imágenes nombradas con la cadena uuid1 generada. Por ejemplo 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Quiero descubrir todas estas imágenes usando el comando “buscar”:

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

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

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

Tenga en cuenta que debe especificar .*/ In the first porque find coincide con la ruta completa.

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 find:

 $ find --version find (GNU findutils) 4.4.2 Copyright (C) 2007 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later  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'. 

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 con cualquier directorio.

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

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

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

Deberia trabajar. (No estoy muy seguro, no puedo hacer que la repetición contada funcione aquí). Puede cambiar a expresiones -regextype posix-egrep 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 find, no sé nada sobre BSD, que también es el predeterminado en Mac).

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

Sin embargo, puedes hacerlo de esta manera:

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

Puede que tengas que modificar un poco el grep y usar diferentes opciones dependiendo de lo que quieras, pero funciona.

Intenta utilizar comillas simples (‘) para evitar el escape de la cadena. Recuerde que la expresión debe coincidir con la ruta completa, es decir, debe tener el siguiente aspecto:

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

Aparte de eso, parece que mi find (GNU 4.4.2) solo conoce expresiones regulares básicas, especialmente no la syntax {36}. Creo que tendrás que arreglártelas sin eso.

Debería usar la ruta de directorio absoluta cuando aplique la instrucción de búsqueda con expresión regular. En tu ejemplo, el

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

debería ser cambiado a

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

En la mayoría de los sistemas Linux, el sistema no puede reconocer algunas disciplinas en expresiones regulares, por lo que debe señalar explícitamente -regexty como

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

Manera simple: puede especificar. * Al principio porque encontrar coincide con la ruta completa.

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

encontrar versión

 $ find --version find (GNU findutils) 4.6.0 Copyright (C) 2015 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later . 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. Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2) 

en Mac (hallazgo de BSD) : al igual que la respuesta aceptada, se necesita el prefijo .*/ para hacer coincidir una ruta completa:

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

man find -E dice que -E usa soporte de expresiones regulares extendido

    Intereting Posts