Intereting Posts
Где вилка () на вилочной бомбе: () {: |: &};:? Как расшифровать пароль? Не удается установить LibreOffice 5 в Linux Mint 17.2, правило политики не учитывается? Скрипт для вставки строки в файлы в поддиректории Awk и отбрасывание несовпадающих токенов в строке? В чем разница в использовании процессора между «ps aux» и «ps -ef»? Как переключиться на ipv6 на Linux? Почему ядро ​​3.6.2 намного менее энергоэффективно, чем 3.6.1 на Mint 13? Если количество строк в строке csv больше, чем x, то удалите второй экземпляр Разница между скобками и фигурными скобками в терминале? Как я могу найти все самоопределенные переменные и функции для отмены? Заменить косую черту в имени файла Балансировка нагрузки и резервирование на FreeBSD Intel Edison Ubilinux как дистрибутив Я получаю FAILED Запуск расширенного управления IEEE 802.11: hostapdrmdir : Нет такого файла или каталога Как сохранить цветной выход, если трубопровод «меньше -R»?

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

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