Рекурсивно grep только каталоги, соответствующие шаблону? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь выяснить, как ускорить рекурсивный grep, ища только файлы в подкаталогах, которые соответствуют строке.

Пример:

/foo/bar/baz/mylogs/somelog.log
/foo/bar/notme.log
/cat/dog/mylogs/anotherlog.log

Мне нужно выполнить grep только для файлов *.log в */mylogs/*

Я могу найти все файлы журналов со следующими ...

egrep -h -R --include \*.log '(pattherns|to|match)'

но это не так ...

egrep -h -R --include \/mylogs/\*.log '(pattherns|to|match)'

Как я могу сузить путь включения?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

grep имеет опцию --exclude-dir, но не --include-dir.Опция --include позволяет вам соответствовать только имени файла, а не filepath

Если вы используете более новые версии оболочки bash или других оболочек, поддерживающих extglob, вы также можете сделать это:

$ shopt -s extglob 
$ # mylogs without sub-dirs
$ ls **/mylogs/*.log
cat/dog/mylogs/anotherlog.log  foo/bar/baz/mylogs/somelog.log

$ # if mylogs can have sub-dirs as well
$ ls **/mylogs/**/*.log
a/b/mylogs/c/d/f.log  cat/dog/mylogs/anotherlog.log  foo/bar/baz/mylogs/somelog.log

как только вы убедитесь, что файлы совпадают по необходимости, используйте grep с этим glob

grep -h '(pattherns|to|match)' **/mylogs/*.log
0 голосов
/ 20 декабря 2018

Никогда не используйте GNU grep для поиска файлов, поскольку они совершенно не нужны, и просто загромождайте ваши вызовы grep множеством опций поиска файлов и реальных параметров g / re / p.Сохраняйте это простым и используйте find до , найдите файлы и grep до г / ре / р внутри файлов:

find . -type d -name mylogs -print0 |
xargs -0 -I XX find XX -maxdepth 1 -type f -name '*.log' -exec grep -h 'foo' {} +

, или вы можете даже простосделайте это, если имена ваших файлов не содержат символов новой строки:

find . -type f -name '*.log' | grep '/mylogs/' | xargs grep -h 'foo'
0 голосов
/ 20 декабря 2018

Один из вариантов - использовать find, чтобы найти любые каталоги, соответствующие этому имени и использующие его флаг exec для запуска egrep на том, что он находит.Следующий пример рекурсивно egrep s через соответствующие каталоги для шаблона 'foo':

find . -type d -name mylogs -exec egrep -hR --include=\*.log foo {} +

Суффикс + означает, что find будет передавать столько результатов в один процесс egrep, сколькоэто может.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...