Как я могу исключить каталоги из grep-R?
Я хочу просмотреть все подкаталоги, кроме каталога "node_modules".
12 ответов
Решение 1 (объединить find
и grep
)
цель этого решения - не иметь дело с grep
производительность, но чтобы показать портативное решение : также следует работать с busybox или GNU версии старше 2.5.
использовать find
, для исключения каталогов foo и bar:
find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print
затем объединить find
и нерекурсивное использование grep
, как портативное решение :
find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;
решение 2 (рекурсивное использование grep
):
вы уже знаете это решение, но я добавляю его, так как это самое последнее и эффективное решение. Обратите внимание, что это менее портативное решение, но более удобочитаемое.
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
решение 3 (Ag)
если вы часто поиск через код Ag (Серебряный Искатель) гораздо более быстрая алтернатива к grep, то подгоняно для поиск кода. Например, он автоматически игнорирует файлы и каталоги, перечисленные в .gitignore
, поэтому вам не нужно продолжать передавать те же громоздкие опции исключения в grep
или find
.
последние версии в GNU grep в ( > = 2.5.2) обеспечить:
--exclude-dir=dir
который исключает каталоги, соответствующие шаблону dir
из рекурсивного поиска в каталоге.
так что вы можете сделать:
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
для получения дополнительной информации о синтаксисе и использовании см.
- man-страница GNU для выбор файла и каталога
- связанный ответ StackOverflow используйте grep --exclude/--include синтаксис, чтобы не grep через определенные файлы
для старых GNU Greps и POSIX Grep используйте find
как указано в другие ответы.
или просто использовать ack
(редактировать или Серебряный Искатель) и покончим с этим!
Если вы хотите исключить несколько каталогов :
" r " для рекурсивных," l "печатать только имена файлов, содержащих совпадения и" i " игнорировать различия регистров :
grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search
пример : я хочу найти файлы, содержащие слово 'привет'. Я хочу искать во всех моих каталогах linux за исключением proc, boot, sys и root каталог :
grep -rli --exclude-dir={proc,boot,root,sys} hello /
Примечание: пример выше должен быть root
примечание 2 (согласно @skplunkerin): не добавляйте пробелы после запятых в {dir1,dir2,dir3}
этот синтаксис
--exclude-dir={dir1,dir2}
расширяется оболочкой (например, Bash), а не grep
в этого:
--exclude-dir=dir1 --exclude-dir=dir2
цитирование предотвратит расширение оболочки, поэтому это не сработает:
--exclude-dir='{dir1,dir2}' <-- this won't work
шаблоны с --exclude-dir
те же самые шаблоны, описанные на странице man для :
--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
.
собирая его вместе, вы в конечном итоге получаете что-то вроде:
grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>
описывая его, это звучит намного сложнее, чем на самом деле. Проще проиллюстрировать простым образец.
пример:
предположим, я ищу текущий проект для всех мест, где я явно задал строковое значение debugger
во время сеанса отладки, а сейчас хотите просмотреть / удалить.
Я пишу сценарий под названием findDebugger.sh
и использовать grep
найти все вхождения. Однако:
для исключений файлов-я хочу убедиться, что .eslintrc
игнорируется (это на самом деле есть правило пылеобразования о debugger
так должно быть исключенный.) Аналогично, я не хочу, чтобы мой собственный сценарий упоминался в каких-либо результатах.
для исключений каталога-я хочу исключить node_modules
поскольку он содержит множество библиотек, которые ссылаются debugger
и меня не интересуют эти результаты. Также я просто хочу опустить .idea
и .git
скрытые каталоги, потому что я тоже не забочусь об этих местах поиска и хочу сохранить производительность поиска.
Итак, вот результат - я создаю скрипт под названием findDebugger.sh
С:
#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .
очень полезно, особенно для тех, кто имеет дело с узел.js где мы хотим избежать поиска внутри "node_modules":
find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
простая рабочая команда:
root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"
выше I grep для текста "creativecommons.org" в текущем каталоге "dspace" и исключить dirs {log, assetstore}.
сделано.
если вы grepping для кода в репозитории git и node_modules
в своем .gitignore
, вы можете использовать git grep
. git grep
поиск записанных файлов в рабочем дереве, игнорируя все от .gitignore
git grep "STUFF"
более простым способом было бы фильтровать ваши результаты с помощью "grep-v".
grep -i needle -R * | grep -v node_modules