рекурсивный grep: исключите определенные каталоги

Я использую рекурсивный grep много для нахождения исходных файлов с определенным содержанием.

grep -Rni "myfunc" .

На больших кодовых базах это может стать медленным, таким образом, я использую - включают для ограничивания/добавления расширений в белый список.

grep -Rni --include=*.java "myfunc" .

Однако было бы более эффективно исключить (сокращают) целые подкаталоги, я думаю:

grep -Rni --exclude=/.svn/ "myfunc" .

Но - исключают только шаблоны файла поддержек как *.java выше. Как я могу исключить каталоги?

49
задан 06.11.2009, 16:48

5 ответов

Вы могли бы изучить ack.

Я только что начал использовать его, но это кажется подходящим для этого.

10
ответ дан 07.12.2019, 08:30

можно использовать, находят вместо этого:

find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print

Хорошо, таким образом, это немного назад, Вы получаете результаты grep сначала и затем путь. Возможно, someoe еще имеет лучший ответ?

6
ответ дан 07.12.2019, 08:30
  • 1
    хорошо, мне нравится этот много. конечно, находка намного более гибка. единственная разница между выводом - то, что "grep-Rni" распечатает имя файла для каждого соответствия, тогда как "находят - должностное лицо grep" распечатает имя файла на одной строке и затем одной строке для каждого соответствия (с номером строки и содержанием строки). использование "grep-Hni" вынуждает имя файла быть отображенным на каждой строке – gabor 06.11.2009, 15:59

Вот полный пример из сценария в одном из моих проектов, которые могли бы помочь, я называю этот файл "all_source" (отмеченным как исполняемый файл) и помещаю его в корневой каталог моего проекта, затем называют его как grep myfunc $(./all_source) вид в конце сценария является полностью дополнительным.

#!/bin/bash

find . \
    -type d \( \
            -wholename './lib' -o \
            -wholename './vc6' -o \
            -name 'gen' -o \
            -name '.svn' \
            \) -prune -o \
    -type f \( \
            -name '*.h' -o \
            -name '*.cpp' -o \
            -name '*.c' -o \
            -name '*.lua' -o \
            -name '*.*awk' \) -print \
    | sort

Этот сценарий возвращает все имена файлов в проекте то соответствие *.h, *.cpp, *.c, *.lua, *.*awk, но не ищет во всех папках, названных .svn и папками генерала, а также пропуском папок для ./lib и ./vc6 (но только те сразу же корень проекта). Таким образом, когда Вы делаете grep myfunc $(./all_source) это только держит в тех файлах. Необходимо будет назвать это от корневого каталога проекта также.

2
ответ дан 07.12.2019, 08:30

Существует также - опция чернослива найти:

 find . -path "*/.svn*" -prune -o -not -type d -exec grep -ni "myfunc" {} \; -print
0
ответ дан 07.12.2019, 08:30
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data

Источник: https://stackoverflow.com/questions/2799246/grep-excluding-a-specific-folder-using

63
ответ дан 07.12.2019, 08:30

Теги

Похожие вопросы