Estoy intentando localizar archivos que coincidan con un patrón particular, sin embargo, intentar ejecutar el siguiente comando no arroja resultados a pesar de que hay archivos que deberían coincidir con el patrón.
find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;
Sé que .*/
coincide con todo el camino, pero no entiendo muy bien qué significa exactamente.
Los archivos que tiene que coincidir, por ejemplo, incluyen
- s_elegir_azul.png
- s_elegir_rojo.png
- s_nuevo_azul.png
Respuesta1
El problema real con su expresión regular es que no coincide con lo que se supone que debe coincidir. Para desglosarlo:
.*/
– cualquier carácter, varias veces, seguido de una barra. Básicamente, esto consume la lista de directorios antes del nombre del archivo real, por lo que coincidiría literalmente./
(como en su ejemplo), pero también./some/other/dir/
hasta la última barra.Esto funciona porque las expresiones regulares son "codiciosas" de forma predeterminada, lo que significa que coinciden tanto como pueden. En esencia, esta parte le permite simplemente buscar el nombre del archivo real y eliminar la ruta del resultado.
Para resumir, necesita el
.*/
frente de la expresión regular si lo único que le importa es el nombre del archivo real. Si también necesita hacer coincidir algunas partes de la ruta con el archivo, no puede usar.*/
s_
– esto funciona bien en tu ejemplo[a-zA-Z]
– esto solo consumeunopersonaje de esta clase_
– seguido de un guión bajo[a-zA-Z]
– nuevamente seguido porunopersonaje\.png
– hacer coincidir literalmente el punto y la extensión
Entonces, debes cambiar tu expresión regular a:
.*/s_[a-zA-Z]+_[a-zA-Z]+\.png
Tendrás que usar el +
, que básicamente dice uno o varios de los anteriores.