45

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

grep -Rni "myfunc" .

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

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

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

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

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

6 ответов6

58
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data

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

10

Вы можете посмотреть в АСК.

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

6

вы можете использовать вместо поиска:

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

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

2

Вот полный пример скрипта в одном из моих проектов, который может помочь. Я называю этот файл "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 и gen, а также в папках. пропуская папки для ./lib и ./vc6 (но только те, которые находятся прямо в корне проекта). Таким образом, когда вы делаете grep myfunc $(./all_source) он только grep в этих файлах. Вам также нужно будет вызвать это из корневого каталога проекта.

0

Существует также опция -prune, чтобы найти:

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

Вы можете попробовать сделать это:

grep -R  "myfunc" . | grep -v path_to_exclude/

Например: если вы не хотите искать содержимое в файлах журналов, просто сделайте следующее:

grep -R "myfunc" . | grep -v log/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .