Захват файлов журналов, которые заканчиваются на любую цифру

Захват файлов журналов, которые заканчиваются на любую цифру

Мы хотим захватить все журналы, которые заканчиваются на «.log.[любое число]

Итак, я создаю этот синтаксис

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

command does not give any output 

Но это не захватывает файлы следующим образом (ожидаемые результаты)

  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

что не так с моим синтаксисом?

решение1

-regex(расширение GNU, также распознаваемое некоторыми другими findреализациями в настоящее время, но с существенными отличиями) похоже, -pathза исключением того, что оно использует регулярные выражения вместо подстановочных знаков. Оно соответствует всему пути файла, а не только его имени.

Таким образом .*\.log.*[0-9](нет необходимости ^или $, кстати, они подразумеваются с помощью find's -regex) будет соответствовать , ./dir/foo.log-3но также ./foo.logic/file.bz2, где .*захвачен ic/file.bz.

-nameсовпадения в файлеимятолько, использует подстановочные знаки, но не имеет аналога регулярных выражений. Здесь, для файлов, имена которых содержат .logи заканчиваются на цифру, вам в любом случае не нужны регулярные выражения, -name '*.foo*[0-9]'.

То же самое можно сделать и с регулярными выражениями -regex '.*\.log[^/]*[0-9]', то есть убедиться, что часть между .logи последней цифрой не содержит никаких /символов, чтобы сопоставлять только имя файла.

С помощью -regexможно пойти дальше в определении шаблонов, особенно если включить расширенные регулярные выражения, используя -Eнекоторые BSD findили -regextype posix-extendedGNU find.

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

Здесь за сопоставлением .logследует один или несколько .<number>или -<number>.

Без регулярных выражений -regextype posix-extendedGNUfindemacsрегулярные выражения, своего рода гибрид между стандартными базовыми регулярными выражениями и стандартными расширенными регулярными выражениями (поддерживает +, но группировка осуществляется с помощью , \(...\)а не (...)).

Без -EBSD findрегулярные выражения являются стандартными базовыми регулярными выражениями.

решение2

Пытаться,

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
  • нам нужно бежать от.

решение3

Если после «log» идут только цифры, .и -, то следующее тоже может сработать

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

решение4

Вы можете искать свои файлы, не прибегая к помощи non-GNU find:

find . -type f \
    \( -name '?*.log.[0-9]' -o \
       \( \
           -name '?*.log.[0-9]*[0-9]'  \
         ! -name '?*.log.?*[!0-9.-]*?' \
         ! -name '?*.log.?*[.-][.-]*?' \
       \) \
    \) \
    -print;

Это делает многоуровневую фильтрацию имен файлов, которые он ловит, и постепенно уменьшает количество уловленных и сосредотачивается на требуемых. Если быть точным:

  • Сразу же выберите любой файл basename, чей путь, т.е. если он не заканчивается на.log.single_digit
  • OTW, выберите те, которые заканчиваются на .log. NUM anything NUMЭто задаст тенденцию для имен файлов, которые будут обнаружены в сети.
  • Из вышеперечисленного отбросьте те, которые случайно имеют non number, non dash, or non dotв anythingчасти имени файла. Обратите внимание, что тенденция начинаться и заканчиваться цифрой должна быть соблюдена.
  • Теперь в нашем улове есть все те файлы, в которых anythingчасть содержит только digit(s), dot(s), и dash(s). Последнее ограничение заключается в том, что dotили dashне должны иметь каждый в качестве своего непосредственного соседа как слева, так и справа.
  • PS Обратите внимание, что эта -nameопция учитывает только базовую часть имени файла, И
  • -nameчасть работает на wildcardоснове и, следовательно, они неявно закреплены, что означает, что сопоставленное имя является полным.

Связанный контент