Как исключить вложенные каталоги в команде grep? - PullRequest
0 голосов
/ 25 января 2019

Я хочу найти слово disable_mlock в текущем каталоге и его подпапках. Для этого я использую:

sam@sam-Dell:~/Desktop$ grep -r disable_mlock
a/vault/config/vault-config.hcl:disable_mlock=true
b/vault/config/vault-config.hcl:disable_mlock=true
vault/config/vault-config.hcl:disable_mlock=true

Тогда я бы хотел исключить только подкаталог vault/config/:

sam@sam-Dell:~/Desktop$ grep -r --exclude-dir=vault/config/
a/vault/config/vault-config.hcl:disable_mlock=true
b/vault/config/vault-config.hcl:disable_mlock=true
vault/config/vault-config.hcl:disable_mlock=true

И это не работает.

Тогда я пытаюсь исключить только vault/ dir:

sam@sam-Dell:~/Desktop$ grep -r disable_mlock --exclude-dir=vault
sam@sam-Dell:~/Desktop$

Он ничего не возвращает ... вероятно, потому что vault/ находится на пути каждого результата.

Если исключить config/:

sam@sam-Dell:~/Desktop$ grep -r disable_mlock --exclude-dir=config/
sam@sam-Dell:~/Desktop$

Результат также не отображается - все совпадения были в каталоге config/. Но я просто хочу исключить один из этих config/ dirs, vault/config/, но не все из них!

Я пришел к выводу, что grep может исключать только один каталог за раз, будь то прямой или глубокий, относительно текущего каталога. В этом случае это проблема для меня, потому что у меня есть пути с похожими каталогами.

Я не могу найти способ , исключая определенные вложенные подкаталоги с grep. Есть ли способ сделать это с помощью grep ?

Ответы [ 3 ]

0 голосов
/ 26 января 2019

GNU find предоставляет больше опций, чем grep для исключения путей:

find -path ./vault/config -prune -o -type f -exec grep pattern {} +

-prune в сочетании с -path path_expression указывает find игнорировать указанный путь.-exec grep ... выполняет фактический поиск.

Эта команда не будет следовать символическим ссылкам, в отличие от grep, что может или не может быть хорошим, в зависимости от ваших потребностей.Используйте опцию -L, если вам нужно следовать им.

0 голосов
/ 26 января 2019

Я предполагаю, что вы строго хотите использовать команду grep, что означает отсутствие трубопровода или других альтернативных команд, которые будут работать лучше.Если вы спешите, проверьте последний код.

Прежде всего, предостережение!Если вы посмотрите на страницу руководства команды grep, вы найдете этот синтаксис для опции --exclude-dir,

 --exclude-dir=PATTERN

Это означает, что опция only принимает шаблон каквход.Вы не можете использовать pathname для него.Вот почему ваш поиск с --exclude-dir=vault/config не сработал.Поскольку он не исключает подкаталог config в каталоге хранилища, он фактически исключает каждый каталог, в имени которого есть 'vault / config', которого нет.

Поэтому, зная это, он просто означает, чтоопция бесполезна для этого контекста.Но мы должны как-то расширить «ключ» и позволить команде точно знать, какие каталоги мы хотим искать.Сначала взглянем на синтаксис команды grep,

grep [OPTION]... PATTERN [FILE]...

TL; DR Как я это делаю,

grep -r disable_mlock ?/vault/config

Я просто использовалэксклюзивный путь к файлу.Знак вопроса (?) - это подстановочный знак, обозначающий «один символ».Это потому, что я знаю, что во всех каталогах, в которых я хочу искать, есть только одна буква в качестве названия.

0 голосов
/ 25 января 2019

Принимаете ли вы трубку в свою команду или хотите ее одним выстрелом? С трубой:

grep -r disable_mlock * | egrep -v "^vault"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...