Использование grep с флагом --exclude-dir для исключения нескольких каталогов


16

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

Я использую следующую команду:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

Эта команда не делает то, что я думал, что будет делать. Вот как я думал, что это будет работать:

  • i - поиск без учета регистра
  • n - вывести номер строки, в которой найден шаблон
  • R - поиск рекурсивно
  • w - я хочу только целые слова - то есть сопоставлять "direct", но не "directory"
  • -E - использовать расширенное регулярное выражение
  • 'direct' - регулярное выражение, которое я хочу сопоставить
  • , - поиск в текущем каталоге
  • --exclude-dir -E 'git | log | asset' - исключить каталоги, которые соответствуют git, log или asset.

Что касается каталогов exclude, команда все равно завершает поиск в каталогах «./git» и «./log» , а также в «./app/assets».

Мне явно не хватает фундаментальных знаний, но я не знаю, что это такое.

Ответы:


16

Описание man-страницы для этой опции вводит в заблуждение ... Это шаблон, как в globs, а не как в regex . На infoстранице :

--exclude-Dir = GLOB

Пропустите любой каталог командной строки с суффиксом имени, соответствующим шаблону GLOB. При рекурсивном поиске пропустите любой подкаталог, базовое имя которого соответствует GLOB. Игнорируйте любые лишние конечные косые черты в GLOB.

Итак, в вашем случае вы можете запустить:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

чтобы исключить каталоги с именами git, logи assetsили , например ,

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

исключить имена каталогов, заканчивающиеся gitили начинающиеся с asset.


Очень интересно. Я думаю, я должен посмотреть, что такое шар.
Стивен Л.

Извините, но, похоже, ничего из этого не работает. Поможет ли мне, если я скажу, что использую эту версию grep: grep (BSD grep) 2.5.1-FreeBSD?
Стивен Л.

Я озадачен, потому что я читаю руководство для bsd grep ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) и там нет упоминания --exclude-dir. Бу.
Стивен Л.

2
ОК, теперь я вижу проблему. Это должна быть модифицированная версия grep, используемая только системой Apple. Я на Mac OS X. Извините за путаницу здесь. Я уверен, что где-то еще есть форум по stackexchange, на который я могу публиковать сообщения.
Стивен Л.

@ user245185 ты на BSD или на OSX? Обе темы здесь, но, пожалуйста, отредактируйте свой вопрос и сообщите нам, какую ОС вы используете. Поведение стандартных инструментов различается в разных реализациях.
Тердон

8

--exclude-dirне понимает |.

Однако вы можете получить тот же эффект, указав --exclude-dirнесколько раз, по одному для каждого каталога, который вы хотите исключить:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'

Это сработало для меня. Я хотел исключить домашний каталог, но он не работал с другими параметрами, такими как --exclude-dir={home}. Я работал, когда печатал--exclude-dir 'home'
Мубин Айсер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.