Как я могу исключить каталоги из 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

для получения дополнительной информации о синтаксисе и использовании см.

для старых 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 .

вы можете попробовать что-то вроде grep -R search . | grep -v '^node_modules/.*'


очень полезно, особенно для тех, кто имеет дело с узел.js где мы хотим избежать поиска внутри "node_modules":

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword

это работает для меня

grep <stuff> -R --exclude-dir=<your_dir>


простая рабочая команда:

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

выше I grep для текста "creativecommons.org" в текущем каталоге "dspace" и исключить dirs {log, assetstore}.

сделано.


find . ! -name "node_modules" -type d 

если вы grepping для кода в репозитории git и node_modules в своем .gitignore, вы можете использовать git grep. git grep поиск записанных файлов в рабочем дереве, игнорируя все от .gitignore

git grep "STUFF"

более простым способом было бы фильтровать ваши результаты с помощью "grep-v".

grep -i needle -R * | grep -v node_modules