Використовуючи grep із прапорцем --exclude-dir для виключення декількох каталогів


16

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

Я використовую таку команду:

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

Ця команда не виконує те, що я думав, що це зробить. Ось як я думав, що це буде працювати:

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

З точки зору виключення каталогів, команда все ще закінчує пошук у каталогах './git' та './log' , а також у './app/assets'

Мені, очевидно, не вистачає фундаментальних знань, але я не знаю, що це.

Відповіді:


16

Опис чоловічої сторінки для цього варіанту є дещо оманливим ... Це шаблон, як у глобусах, а не шаблон, як у регулярному вираженні . На 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.