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

Мы хотим захватить все журналы, которые заканчиваются на “.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 

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

-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 вы можете пойти дальше в определении шаблонов, особенно если вы включаете расширенные -regextype posix-extended , используя -E с некоторыми BSD -regextype posix-extended или -regextype posix-extended с GNU find .

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

Здесь соответствие на .log сопровождается одним или несколькими . или - .

Без -regextype posix-extended GNU -regextype posix-extended emacs , своего рода гибрид между стандартными базовыми -regextype posix-extended и стандартными расширенными регулярными выражениями (поддерживает + , но группировка выполняется с \(...\) вместо (...) ) ,

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

Пытаться,

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

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

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

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

 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 и, следовательно, они неявно привязаны, то есть совпадающее имя является полным.