it-swarm.com.ru

Как я могу исключить каталоги из grep -R?

Я хочу пройти через все подкаталоги, кроме каталога "node_modules".

534
TIMEX

РЕШЕНИЕ 1 (объедините findи grepname __)

Цель этого решения не в том, чтобы иметь дело с производительностью grepname__, а в том, чтобы показать переносимое решение: должно также работать с занятой коробкой или GNU версией, более старой, чем 2.5.

Используйте findNAME _, для исключения каталогов foo и bar:

find /dir \( -name foo -Prune \) -o \( -name bar -Prune \) -o -name "*.sh" -print

Затем объедините findNAME _ и нерекурсивное использование grepNAME _, как портативное решение:

find /dir \( -name node_modules -Prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

РЕШЕНИЕ 2 (рекурсивное использование grepname __):

Вы уже знаете это решение, но я добавляю его, так как это самое последнее и эффективное решение. Обратите внимание, что это менее портативное решение, но более удобочитаемое.

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

Чтобы исключить несколько каталогов, используйте --exclude-dir как:

--exclude-dir={node_modules,dir1,dir2,dir3}

РЕШЕНИЕ 3 (Ag)

Если вы часто просматриваете код, Ag (The Silver Searcher) - это гораздо более быстрая альтернатива grep, она настроена для поиска кода. Например, он автоматически игнорирует файлы и каталоги, перечисленные в .gitignore, поэтому вам не нужно постоянно передавать одни и те же громоздкие опции исключения в grepили findname__.

250
hornetbzz

Последние версии 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 ( Edit : или Серебряный Искатель ) и покончим с этим!

897
Johnsyweb

Если вы хотите исключить несколько каталогов:

"r" для рекурсивного, "l" для печати только имен файлов, содержащих совпадения, и "i" для игнорирования различий в регистре:

 
 grep -rli --exclude-dir = {dir1, dir2, dir3} ключевое слово /path/to/search

Пример: я хочу найти файлы, содержащие слово "привет". Я хочу искать во всех моих каталогах linux кромеproc каталог, boot каталог, sys каталог и корневой каталог:

 
 grep -rli --exclude-dir = {proc, boot, root, sys} hello /

Примечание: приведенный выше пример должен быть пользователем root

Примечание 2 (согласно @skplunkerin): не ставьте пробелы после запятых в {dir1,dir2,dir3}

67
Azodium

Этот синтаксис

--exclude-dir={dir1,dir2}

расширяется оболочкой (например, Bash), а не grep, в это:

--exclude-dir=dir1 --exclude-dir=dir2

Цитирование будет препятствовать тому, чтобы Shell расширила это, таким образом это не будет работать:

--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.

34
Derek Veit

часто используйте это:

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 игнорируется (на самом деле это правило linting о 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 .
13
arcseldon

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

9
DipSwitch

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

git grep "STUFF"
5
0xcaff

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

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

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

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

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

Готово.

2
Dung

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

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

2
angelo.mastro
find . ! -name "node_modules" -type d 
1
Jack

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

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

0
Morris