supongamos que escribo:
find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
Me parece que este comando debería funcionar. He iterado a través de las diversas opciones de regextype y varios formatos de expresiones regulares, pero no puedo lograr que este tipo de expresiones regulares funcionen a través de find. ¿Hay algo simple en lo que me estoy equivocando con respecto a la búsqueda y el analizador de expresiones regulares?
Respuesta1
Find -name
no acepta expresiones regulares (esto se usó en la versión original de la pregunta). Se necesitan globos de shell, y ese no es un globo de shell válido. Desea utilizar la -regex
prueba, pero también debe indicarle que utilice expresiones regulares extendidas o cualquier otro tipo que comprenda las notaciones {N}
y . foo|bar
Finalmente, a diferencia de -name
, la -regex
prueba analiza el nombre de ruta completo, por lo que necesitas algo como esto:
$ find . -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
5678-34-56-bar.csv.gz
1234-12-12-foo.csv.gz
Si quieres usar -name
, puedes hacer:
find . \( \
-name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-foo.csv.gz" \
-o -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-bar.csv.gz" \
\) -printf "%f\n"
Respuesta2
Otra opción es la fd
herramienta:
fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'
Respuesta3
Si tiene nombres de archivos razonables (al menos en esta carpeta), podría ejecutar algo como
find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'
De esta manera podrá beneficiarse de la variedad de opciones de grep.