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.NUManythingNUMIsso 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 dotnaanythingparte 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 apenasdigit(s),dot(s), edash(s). A última restrição é quedotoudashnã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 comwildcardbase e, portanto, está implicitamente ancorada, o que significa que o nome correspondente está completo.


