
Мы хотим захватить все журналы, которые заканчиваются на «.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-extended
GNU find
.
find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD
Здесь за сопоставлением .log
следует один или несколько .<number>
или -<number>
.
Без регулярных выражений -regextype posix-extended
GNUfind
emacsрегулярные выражения, своего рода гибрид между стандартными базовыми регулярными выражениями и стандартными расширенными регулярными выражениями (поддерживает +
, но группировка осуществляется с помощью , \(...\)
а не (...)
).
Без -E
BSD 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
основе и, следовательно, они неявно закреплены, что означает, что сопоставленное имя является полным.