Я использую рекурсивный grep много для нахождения исходных файлов с определенным содержанием.
grep -Rni "myfunc" .
На больших кодовых базах это может стать медленным, таким образом, я использую - включают для ограничивания/добавления расширений в белый список.
grep -Rni --include=*.java "myfunc" .
Однако было бы более эффективно исключить (сокращают) целые подкаталоги, я думаю:
grep -Rni --exclude=/.svn/ "myfunc" .
Но - исключают только шаблоны файла поддержек как *.java выше. Как я могу исключить каталоги?
Вы могли бы изучить ack.
Я только что начал использовать его, но это кажется подходящим для этого.
можно использовать, находят вместо этого:
find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print
Хорошо, таким образом, это немного назад, Вы получаете результаты grep сначала и затем путь. Возможно, someoe еще имеет лучший ответ?
Вот полный пример из сценария в одном из моих проектов, которые могли бы помочь, я называю этот файл "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)
это только держит в тех файлах. Необходимо будет назвать это от корневого каталога проекта также.
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data
Источник: https://stackoverflow.com/questions/2799246/grep-excluding-a-specific-folder-using