Capture arquivos de log que terminam com qualquer número

Capture arquivos de log que terminam com qualquer número

Queremos capturar todos os logs que terminam com ".log.[qualquer número]

Então eu crio essa sintaxe

find .  -type f  -regex '^.log.*[0-9]$' -print

command does not give any output 

Mas isso não captura os arquivos da seguinte forma (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

o que há de errado com minha sintaxe?

Responder1

-regex(uma extensão GNU também reconhecida por algumas outras findimplementações hoje em dia, mas com grandes diferenças) é semelhante, -pathexceto pelo fato de usar regexps em vez de curingas. Ele corresponde a todo o caminho do arquivo, não apenas ao seu nome.

Então .*\.log.*[0-9](não há necessidade ^ou, $a propósito, eles estão implícitos em find's -regex) combinariam, ./dir/foo.log-3mas também ./foo.logic/file.bz2, onde o .*capturado ic/file.bz.

-namecorrespondências no arquivonomeapenas, usa curingas, mas não possui uma contraparte regexp. Aqui, para arquivos cujo nome contém .loge termina em um dígito, você não precisa de regexps de qualquer maneira, -name '*.foo*[0-9]'.

Você pode fazer o mesmo com regexps com -regex '.*\.log[^/]*[0-9]', garantindo que a parte entre .loge o dígito final não contenha nenhum, /para que corresponda apenas ao nome do arquivo.

Com -regex, você pode ir mais longe na especificação dos padrões, especialmente se você habilitar expressões regulares estendidas, usando -Ecom alguns BSDs findou -regextype posix-extendedcom GNU find.

find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD

Aqui correspondendo .logseguido por um ou mais .<number>ou -<number>.

Sem os regexps do -regextype posix-extendedGNU sãofindemacsregexps, algum tipo de híbrido entre regexps básicas padrão e regexps estendidas padrão (suporta +, mas o agrupamento é com \(...\)em vez de (...)).

Sem -EBSD, findos regexps são regexps básicos padrão.

Responder2

Tentar,

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
  • precisamos escapar do.

Responder3

Se depois de "log" houver apenas dígitos, .e -, o seguinte também pode funcionar

find .  -type f   -regex  ".*[.]log[-.0-9]*$" 

Responder4

Você pode pesquisar seus arquivos da seguinte maneira, sem recorrer 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;

O que isso faz é fazer uma filtragem em várias camadas dos nomes de arquivos capturados por ele e diminuir progressivamente a captura e se concentrar no necessário. Para ser mais preciso:

  • Selecione imediatamente qualquer arquivo cujo basename, ou seja, sem o caminho, termine em um.log.single_digit
  • OTW, selecione aqueles que terminam em .log. NUM anything NUMIsso definirá a tendência para os nomes de arquivos serem capturados na rede.
  • Fora do problema acima, rejeite aqueles que possuem um non number, non dash, or non dotna anythingparte do nome do arquivo. Observe que a tendência de começar e terminar com um dígito deve ser respeitada.
  • Agora nosso catch tem todos aqueles arquivos em que anythinga porção compreende apenas digit(s), dot(s), e dash(s). A última restrição é que dotou dashnão deve ter cada um como vizinho imediato à esquerda e à direita.
  • PS Observe que -namea opção analisa apenas a parte do nome base do nome do arquivo, E
  • -nameparte opera com wildcardbase e, portanto, está implicitamente ancorada, o que significa que o nome correspondente está completo.

informação relacionada