Capture archivos de registro que terminen con cualquier número

Capture archivos de registro que terminen con cualquier número

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. NUM anything NUMEsto 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 la anythingparte 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 solo digit(s), dot(s)y dash(s). La última restricción es que doto dashno 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 la wildcardbase y, por lo tanto, están ancladas implícitamente, lo que significa que el nombre coincidente está completo.

información relacionada