Просто введите "man grep", и вы увидите --exclude и опции --exclude-dir, перечисленные прямо здесь - из заголовка этого вопроса, я предполагаю, что вы уже знали о grep ...
arcseldon
35
Если вы ищите код в git-репозитории и node_modulesиспользуете свой .gitignore, git grep "STUFF"это самый простой способ. git grepищет отслеживаемые файлы в рабочем дереве, игнорируя все из.gitignore
0xcaff
2
Пример для узла: grep -R --exclude-dir={node_modules,bower_components} "MyString" | cut -c1-"$COLUMNS"- кроме того, вы всегда можете присвоить псевдониму в оболочке значение 'nodegrep' или что-либо еще и использовать аргумент команды в качестве строкового ввода ..
bshea
Ответы:
395
РЕШЕНИЕ 1 (объединить findи grep)
Цель этого решения не в том, чтобы иметь дело с grepпроизводительностью, а в том, чтобы продемонстрировать переносимое решение: оно также должно работать с занятой версией или GNU версии старше 2.5.
Используйте find, для исключения каталогов foo и bar:
Вы уже знаете это решение, но я добавляю его, так как это самое последнее и эффективное решение. Обратите внимание, что это менее портативное решение, но более удобочитаемое.
Чтобы исключить несколько каталогов, используйте --exclude-dirкак:
--exclude-dir={node_modules,dir1,dir2,dir3}
РЕШЕНИЕ 3 (Ag)
Если вы часто просматриваете код, Ag (The Silver Searcher) - гораздо более быстрая альтернатива grep, настроенная для поиска кода. Например, он автоматически игнорирует файлы и каталоги, перечисленные в .gitignore, так что вам не нужно постоянно передавать те же громоздкие опции исключения для grepили find.
эта комбинация ищет быстрее, чем --exclude-dir=dirи показывает результаты с цветами - легко читаемо
Максим Ефремов
27
«эта комбинация» find ... -execне быстрее чем grep --exclude-dirдля меня. Огромное преимущество в Grep (примерно в пять раз быстрее 26K + файлы, отфильтрованных 38K + на HDD), если не заменить \;с +для поиска / ехес комбо. Тогда grep «только» примерно на 30% быстрее. Синтаксис grep также удобен для чтения :).
Кьелл Андреассен
Договорились, так как это очевидно. У некоторых busyboxes нет команды GREP.
hornetbzz
10
Также отметим, что вы можете исключить множественное число с--exclude-dir={dir1,dir2}
Suh
4
Я нисколько не удивлен, что node_modulesэто канонический пример.
pdoherty926
984
Последние версии GNU Grep (> = 2.5.2 ) предоставляют:
--exclude-dir=dir
который исключает каталоги, соответствующие шаблону, dirиз рекурсивных поисков по каталогам.
@Manocho: Если вы думаете, что ackэто здорово, попробуйте Серебряный Искатель и увидите увеличение скорости!
Johnsyweb
30
Синтаксис для нетерпеливых: --exclude-dir=dirиспользует grepшаблоны регулярных выражений, а не глобализацию файлов оболочки. Шаблоны работают на пути относительно вашего текущего каталога. Так что используйте шаблон --exclude-dir=dir, а не --exclude-dir="/root/dir/*".
Tanius
15
Если вы хотите исключить несколько директорий из поиска, есть лучший вариант , чем использование: $ grep -r --exclude-dir=dir1 --exclude-dir=dir2 "string" /path/to/search/dir?
Даршан Чаудхари
4
Вероятно, я потратил на это слишком много времени, чем любой здравомыслящий человек, но я не могу понять, как исключить подкаталог из поиска - grep -r --exclude-dir=public keyword .работает, но grep -r --exclude-dir='public/dist' keyword .не работает. Я пытался добавить подстановочные знаки регулярных выражений, экранировать символы и т. Д., Но ничего не помогло.
Дкобозев
73
Исключить несколько каталогов, например, так:grep -r "Request" . --exclude-dir={node_modules,git,build}
maverick97
78
Если вы хотите исключить несколько каталогов :
«r» для рекурсии, «l» для печати только имен файлов, содержащих совпадения, и «i» для игнорирования различий в регистре:
Пример: я хочу найти файлы, содержащие слово «привет». Я хочу искать во всех моих каталогах linux, кроме каталога proc , загрузочного каталога, каталога sys и корневого каталога:
ПРИМЕЧАНИЕ: не добавляйте пробелы после запятых в{dir1,dir2,dir3}
skplunkerin
Спасибо, удобно, когда grep'ing через рабочее пространство SVN:grep -Irsn --exclude-dir=.svn 'foo' .
RAM237
1
Вы можете просто предоставить --exclude-dirопцию несколько раз.
Уолф
45
Этот синтаксис
--exclude-dir={dir1,dir2}
расширяется с помощью оболочки (например, Bash), а не с помощью grepэтого:
--exclude-dir=dir1 --exclude-dir=dir2
Заключение в кавычки предотвратит расширение оболочки, поэтому это не сработает:
--exclude-dir='{dir1,dir2}' <-- this won't work
Используемые шаблоны --exclude-dir- это шаблоны того же типа, которые описаны на странице руководства для --excludeопции:
--exclude=GLOB
Skip files whose base name matches GLOB (using wildcard matching).
A file-name glob can use *, ?, and [...] as wildcards, and \ to
quote a wildcard or backslash character literally.
Оболочка, как правило, сама пытается развернуть такой шаблон, поэтому, чтобы избежать этого, вы должны заключить его в кавычки:
--exclude-dir='dir?'
Вы можете использовать фигурные скобки и шаблоны исключений в кавычках вместе, как это:
--exclude-dir={'dir?','dir??'}
Шаблон может охватывать несколько сегментов пути:
--exclude-dir='some*/?lse'
Это исключило бы каталог как topdir/something/else.
grepможет использоваться вместе с -r(рекурсивным), i(игнорировать регистр) и -o(печатает только совпадающую часть строк). Чтобы исключить filesиспользование --excludeи исключить использование каталогов --exclude-dir.
Описание этого звучит намного сложнее, чем есть на самом деле. Проще проиллюстрировать на простом примере.
Пример:
Предположим, я ищу текущий проект для всех мест, где я явно установил строковое значение debugger во время сеанса отладки, и теперь хочу просмотреть / удалить.
Я пишу сценарий с именем findDebugger.shи использую, grepчтобы найти все вхождения. Однако:
Для файловых исключений - я хочу убедиться, что .eslintrcэто игнорируется (на самом деле это правило linting, debuggerпоэтому его следует исключить). Кроме того, я не хочу, чтобы мой собственный сценарий упоминался в каких-либо результатах.
Для исключений из каталогов - я хочу исключить, так node_modulesкак он содержит много библиотек, на которые есть ссылки, debuggerи меня не интересуют эти результаты. Кроме того, я просто хочу опустить .ideaи .gitскрытые каталоги, потому что меня не волнуют эти места поиска, и я хочу сохранить результативность поиска.
Итак, вот результат - я создаю скрипт findDebugger.shс именем :
Не очень хорошее решение в некоторых случаях. Например: если каталог 'node_modules' является огромным с большим количеством ложноположительных совпадений (отсюда и необходимость отфильтровывать каталог), то первый grep тратит много времени на поиск в подкаталоге, а затем - на второй grep-фильтрацию. вне матчей. Быстрее исключить node_modules в самом первом grep.
ГуруМ 13.12.12
2
меня не волнует медлительность, я могу посмотреть на команду и узнать, что она делает
Funkodebat
1
То же самое для комментария Гуру. Грех /varзависает, когда он попадает /var/runв моем случае. Отсюда и причина, по которой я хочу избежать каталога.
jww
3
--exclude-dirлучшее решение с 2016 года.
Омар Тарик
10
Если для кода оглавлению в мерзавце хранилища и node_modulesнаходится в вашем .gitignore, вы можете использовать git grep. git grepищет отслеживаемые файлы в рабочем дереве, игнорируя все из.gitignore
Аккуратный, в том числе несколько каталогов в скобках
Mijo
2
Здесь было дано много правильных ответов, но я добавляю этот, чтобы подчеркнуть один момент, который вызвал некоторые спешные попытки потерпеть неудачу раньше: exclude-dirберет образец , а не путь к каталогу.
Скажите, что ваш поиск:
grep -r myobject
И вы заметили, что ваши результаты загромождены результатами из src/other/objects-folder. Эта команда не даст вам ожидаемого результата:
И вы можете удивиться, почему exclude-dirне работает! Чтобы фактически исключить результаты из objects-folder, просто сделайте это:
grep -r myobject --exclude-dir=objects-folder
Другими словами, просто используйте имя папки , а не путь. Очевидно, когда вы это знаете.
Со страницы руководства:
--exclude-dir = GLOB
Пропустить любой каталог командной строки с суффиксом имени, соответствующим шаблону GLOB. При поиске рекурсивно пропустите любой подкаталог, базовое имя которого соответствует GLOB. Игнорируйте любые лишние конечные косые черты в GLOB.
node_modules
используете свой.gitignore
,git grep "STUFF"
это самый простой способ.git grep
ищет отслеживаемые файлы в рабочем дереве, игнорируя все из.gitignore
grep -R --exclude-dir={node_modules,bower_components} "MyString" | cut -c1-"$COLUMNS"
- кроме того, вы всегда можете присвоить псевдониму в оболочке значение 'nodegrep' или что-либо еще и использовать аргумент команды в качестве строкового ввода ..Ответы:
РЕШЕНИЕ 1 (объединить
find
иgrep
)Цель этого решения не в том, чтобы иметь дело с
grep
производительностью, а в том, чтобы продемонстрировать переносимое решение: оно также должно работать с занятой версией или GNU версии старше 2.5.Используйте
find
, для исключения каталогов foo и bar:Затем совместим
find
и нерекурсивное использованиеgrep
, в качестве переносимого решения:РЕШЕНИЕ 2 (рекурсивное использование
grep
):Вы уже знаете это решение, но я добавляю его, так как это самое последнее и эффективное решение. Обратите внимание, что это менее портативное решение, но более удобочитаемое.
Чтобы исключить несколько каталогов, используйте
--exclude-dir
как:--exclude-dir={node_modules,dir1,dir2,dir3}
РЕШЕНИЕ 3 (Ag)
Если вы часто просматриваете код, Ag (The Silver Searcher) - гораздо более быстрая альтернатива grep, настроенная для поиска кода. Например, он автоматически игнорирует файлы и каталоги, перечисленные в
.gitignore
, так что вам не нужно постоянно передавать те же громоздкие опции исключения дляgrep
илиfind
.источник
--exclude-dir=dir
и показывает результаты с цветами - легко читаемоfind ... -exec
не быстрее чемgrep --exclude-dir
для меня. Огромное преимущество в Grep (примерно в пять раз быстрее 26K + файлы, отфильтрованных 38K + на HDD), если не заменить\;
с+
для поиска / ехес комбо. Тогда grep «только» примерно на 30% быстрее. Синтаксис grep также удобен для чтения :).--exclude-dir={dir1,dir2}
node_modules
это канонический пример.Последние версии GNU Grep (> = 2.5.2 ) предоставляют:
который исключает каталоги, соответствующие шаблону,
dir
из рекурсивных поисков по каталогам.Так что вы можете сделать:
Для получения дополнительной информации о синтаксисе и использовании см.
Для более старых GNU Greps и POSIX Grep используйте,
find
как предлагается в других ответах.Или просто используйте
ack
( Edit : или The Silver Searcher ) и покончите с этим!источник
ack
это здорово, попробуйте Серебряный Искатель и увидите увеличение скорости!--exclude-dir=dir
используетgrep
шаблоны регулярных выражений, а не глобализацию файлов оболочки. Шаблоны работают на пути относительно вашего текущего каталога. Так что используйте шаблон--exclude-dir=dir
, а не--exclude-dir="/root/dir/*"
.$ grep -r --exclude-dir=dir1 --exclude-dir=dir2 "string" /path/to/search/dir
?grep -r --exclude-dir=public keyword .
работает, ноgrep -r --exclude-dir='public/dist' keyword .
не работает. Я пытался добавить подстановочные знаки регулярных выражений, экранировать символы и т. Д., Но ничего не помогло.grep -r "Request" . --exclude-dir={node_modules,git,build}
Если вы хотите исключить несколько каталогов :
«r» для рекурсии, «l» для печати только имен файлов, содержащих совпадения, и «i» для игнорирования различий в регистре:
Пример: я хочу найти файлы, содержащие слово «привет». Я хочу искать во всех моих каталогах linux, кроме каталога proc , загрузочного каталога, каталога sys и корневого каталога:
Примечание: приведенный выше пример должен быть root
Примечание 2 (согласно @skplunkerin): не ставьте пробелы после запятых в
{dir1,dir2,dir3}
источник
{dir1,dir2,dir3}
grep -Irsn --exclude-dir=.svn 'foo' .
--exclude-dir
опцию несколько раз.Этот синтаксис
расширяется с помощью оболочки (например, Bash), а не с помощью
grep
этого:Заключение в кавычки предотвратит расширение оболочки, поэтому это не сработает:
Используемые шаблоны
--exclude-dir
- это шаблоны того же типа, которые описаны на странице руководства для--exclude
опции:Оболочка, как правило, сама пытается развернуть такой шаблон, поэтому, чтобы избежать этого, вы должны заключить его в кавычки:
Вы можете использовать фигурные скобки и шаблоны исключений в кавычках вместе, как это:
Шаблон может охватывать несколько сегментов пути:
Это исключило бы каталог как
topdir/something/else
.источник
Часто используйте это:
grep
может использоваться вместе с-r
(рекурсивным),i
(игнорировать регистр) и-o
(печатает только совпадающую часть строк). Чтобы исключитьfiles
использование--exclude
и исключить использование каталогов--exclude-dir
.Собрав все вместе, вы получите что-то вроде:
Описание этого звучит намного сложнее, чем есть на самом деле. Проще проиллюстрировать на простом примере.
Пример:
Предположим, я ищу текущий проект для всех мест, где я явно установил строковое значение
debugger
во время сеанса отладки, и теперь хочу просмотреть / удалить.Я пишу сценарий с именем
findDebugger.sh
и использую,grep
чтобы найти все вхождения. Однако:Для файловых исключений - я хочу убедиться, что
.eslintrc
это игнорируется (на самом деле это правило linting,debugger
поэтому его следует исключить). Кроме того, я не хочу, чтобы мой собственный сценарий упоминался в каких-либо результатах.Для исключений из каталогов - я хочу исключить, так
node_modules
как он содержит много библиотек, на которые есть ссылки,debugger
и меня не интересуют эти результаты. Кроме того, я просто хочу опустить.idea
и.git
скрытые каталоги, потому что меня не волнуют эти места поиска, и я хочу сохранить результативность поиска.Итак, вот результат - я создаю скрипт
findDebugger.sh
с именем :источник
-R
(я не помню, почему сейчас). Я обычно использую-r
. Оказывается, что заглавная версия следует за символическими ссылками . TIL.Вы можете попробовать что-то вроде
grep -R search . | grep -v '^node_modules/.*'
источник
/var
зависает, когда он попадает/var/run
в моем случае. Отсюда и причина, по которой я хочу избежать каталога.--exclude-dir
лучшее решение с 2016 года.Если для кода оглавлению в мерзавце хранилища и
node_modules
находится в вашем.gitignore
, вы можете использоватьgit grep
.git grep
ищет отслеживаемые файлы в рабочем дереве, игнорируя все из.gitignore
источник
Очень полезно, особенно для тех, кто имеет дело с Node.js, где мы хотим избежать поиска внутри "node_modules":
источник
Простая рабочая команда:
Выше я grep для текста «creativecommons.org» в текущем каталоге «dspace» и исключаю dirs {log, assetstore}.
Выполнено.
источник
Здесь было дано много правильных ответов, но я добавляю этот, чтобы подчеркнуть один момент, который вызвал некоторые спешные попытки потерпеть неудачу раньше:
exclude-dir
берет образец , а не путь к каталогу.Скажите, что ваш поиск:
И вы заметили, что ваши результаты загромождены результатами из
src/other/objects-folder
. Эта команда не даст вам ожидаемого результата:И вы можете удивиться, почему
exclude-dir
не работает! Чтобы фактически исключить результаты изobjects-folder
, просто сделайте это:Другими словами, просто используйте имя папки , а не путь. Очевидно, когда вы это знаете.
Со страницы руководства:
источник
Этот работает для меня:
источник
источник
Более простым способом было бы отфильтровать результаты с помощью "grep -v".
grep -i needle -R * | grep -v node_modules
источник