Queremos capturar todos los registros que terminaron con ".log.[cualquier número]
Entonces creo esta sintaxis
find . -type f -regex '^.log.*[0-9]$' -print
command does not give any output
Pero esto no captura los archivos como se muestra a continuación (resultados esperados)
controller.log.2018-01-03-01
server.log.2017-10-31-03
server.log.2018-01-23-11
server.log.2018-04-06-17
server.log.2018-07-07-05
controller.log.2018-01-03-02
log-cleaner.log.10
server.log.2017-10-31-04
server.log.2018-01-23-12
server.log.2018-04-06-18
server.log.2018-07-07-06
controller.log.2018-01-03-03
log-cleaner.log.2
server.log.232.434
¿Qué hay de malo en mi sintaxis?
Respuesta1
-regex(una extensión GNU también reconocida por algunas otras findimplementaciones hoy en día pero con grandes diferencias) es similar -pathexcepto que usa expresiones regulares en lugar de comodines. Coincide con toda la ruta del archivo, no solo con su nombre.
Entonces .*\.log.*[0-9](no es necesario ^o $, por cierto, están implícitos con find's -regex) coincidiría con, ./dir/foo.log-3pero también ./foo.logic/file.bz2, donde se .*capturó ic/file.bz.
-namecoincidencias en el archivonombresolamente, utiliza comodines pero no tiene una contraparte de expresión regular. Aquí, para los archivos cuyo nombre contiene .logy termina en un dígito, no necesita expresiones regulares de todos modos -name '*.foo*[0-9]'.
Puedes hacer lo mismo con las expresiones regulares -regex '.*\.log[^/]*[0-9]', es decir, asegurándote de que la parte entre el .logdígito final y el final no contenga ninguna /para que coincida solo con el nombre del archivo.
Con -regex, puede ir más allá al especificar los patrones, especialmente si habilita expresiones regulares extendidas, usándolas -Econ algunos BSD findo -regextype posix-extendedcon GNU find.
find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD
Aquí coincide con .logseguido de uno o más .<number>o -<number>.
Sin las expresiones regulares de -regextype posix-extendedGNU findsonemacsexpresiones regulares, una especie de híbrido entre expresiones regulares básicas estándar y expresiones regulares extendidas estándar (admite +, pero la agrupación es con \(...\)en lugar de (...)).
Sin -EBSD, findlas expresiones regulares son expresiones regulares básicas estándar.
Respuesta2
Intentar,
find . -type f -regex ".*\.log\..*[0-9]$"
./server.log.2018-01-23-12
./server.log.2018-07-07-06
./log-cleaner.log.2
./log-cleaner.log.10
./server.log.232.434
./server.log.2018-01-23-11
./server.log.2017-10-31-03
./controller.log.2018-01-03-01
./server.log.2018-04-06-17
./log-cleaner.log.1
./controller.log.2018-01-03-03
./server.log.2018-04-06-18
./controller.log.2018-01-03-02
./server.log.2018-07-07-05
./server.log.2017-10-31-04
- necesitamos escapar del
.
Respuesta3
Si después de "registro" solo hay dígitos, .y -, lo siguiente también podría funcionar
find . -type f -regex ".*[.]log[-.0-9]*$"
Respuesta4
Puede buscar sus archivos de la siguiente manera sin recurrir a non-GNU find:
find . -type f \
\( -name '?*.log.[0-9]' -o \
\( \
-name '?*.log.[0-9]*[0-9]' \
! -name '?*.log.?*[!0-9.-]*?' \
! -name '?*.log.?*[.-][.-]*?' \
\) \
\) \
-print;
Lo que esto hace es realizar un filtrado de múltiples capas de los nombres de archivos capturados por él y progresivamente reduce la captura y se concentra en lo requerido. Para ser preciso:
- Seleccione inmediatamente cualquier archivo cuyo
basename, es decir, sin su ruta, termine en un.log.single_digit - OTW, seleccione aquellos que terminan en
.log.NUManythingNUMEsto establecerá la tendencia de que los nombres de archivos queden atrapados en la red. - De las capturas anteriores, rechace aquellas que tengan una
non number, non dash, or non doten laanythingparte del nombre del archivo. Tenga en cuenta que se debe respetar la tendencia de comenzar y terminar con un dígito. - Ahora nuestra captura tiene todos esos archivos en los que
anythingparte comprende solodigit(s),dot(s)ydash(s). La última restricción es quedotodashno debe tener a cada uno como vecino inmediato tanto a su izquierda como a su derecha. - PD: Tenga en cuenta que
-namela opción mira solo la parte del nombre base del nombre del archivo, Y -nameLa porción opera sobre lawildcardbase y, por lo tanto, están ancladas implícitamente, lo que significa que el nombre coincidente está completo.


