Исключить каталоги .svn из grep

Когда я grep мой каталог рабочей копии Subversion, результаты включают в себя большое количество файлов из каталогов .svn. Возможно ли рекурсивно grep каталоги, но исключить все результаты из .svn-каталогов?

Ответ 1

Если у вас есть GNU Grep, он должен работать следующим образом:

grep --exclude-dir=".svn"

Если в системе Unix отсутствует GNU Grep, попробуйте следующее:

grep -R "whatever you like" *|grep -v "\.svn/*" 

Ответ 2

Если вы используете ack ( "лучше grep" ), он будет обрабатывать это автоматически (и делать много других умных вещей тоже!), Это стоит проверить.

Ответ 3

Для grep >= 2.5.1a

Вы можете поместить это в свою среду (например, .bashrc)

export GREP_OPTIONS='--exclude-dir=".svn"'

PS: благодаря Adrinan в моей версии есть дополнительные кавычки:

export GREP_OPTIONS='--exclude-dir=.svn'

Ответ 4

psychoschlumpf верен, но он работает только в том случае, если у вас установлена ​​последняя версия grep. Более ранние версии не имеют опции --exclude-dir. Однако, если у вас очень большая база кода, double- grep -ing может длиться вечно. Поместите это в свой .bashrc для переносимого .svn -less grep:

alias sgrep='find . -path "*/.svn" -prune -o -print0 | xargs -0 grep'

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

sgrep some_var

... и получить ожидаемые результаты.

Конечно, если вы такой сумасшедший человек, как я, который просто должен использовать один и тот же .bashrc везде, вы могли бы потратить 4 часа на запись сложной функции bash, чтобы вместо этого поставить там. Или, вы можете просто подождать, пока такой сумасшедший человек, как я, опубликует его онлайн:

http://gist.github.com/573928

Ответ 5

grep --exclude-dir=".svn"

работает, потому что имя ".svn" довольно уникально. Но это может завершиться неудачей при более обобщенном имени.

grep --exclude-dir="work"

не является пуленепробиваемым, если у вас есть "/home/user/work" и "/home/user/stuff/work", он пропустит оба. Невозможно определить "/*/work/*"  чтобы исключить только прежнее имя папки. Насколько я мог экспериментировать, в GNU grep простой -exclude не будет исключать каталоги.

Ответ 6

Два grep будут делать трюк:

  • Первый grep получит все.
  • Второй grep будет использовать вывод первого grep в качестве входа (через трубопровод). Используя флаг -v, grep выберет строки, которые НЕ соответствуют условиям поиска. Вуаля. Вы остаетесь со всеми выводами из первого grep, которые не содержат .svn в пути к файлам.

    -v, -invert-match     Инвертируйте смысл соответствия, чтобы выбрать несогласованные строки.

    grep the_text_you_want_to_search_for * | grep -v .svn
    

Ответ 7

Я попробовал двойной grep'in на моей огромной базе кода, и это заняло навсегда, поэтому я получил это решение с помощью моего сотрудника

Обрезка выполняется намного быстрее, так как она перестает находить от обработки этих каталогов по сравнению с "grep -v", которая обрабатывает все и исключает отображение результатов

find . -name .svn -prune -o -type f -print0 | xargs -0 egrep 'YOUR STRING'

Вы также можете использовать эту команду в своем .bashrc как

alias sgrep='find . -name .svn build -prune -o -type f -print0 | xargs -0 egrep '

Теперь просто используйте

sgrep 'whatever' 

Ответ 8

В моем GNU grep 2.5 параметр --exclude-dirs не является допустимым. В качестве альтернативы это хорошо сработало для меня:

grep --exclude="*.svn-base"

Это должно быть лучшим решением, чем исключение всех строк, содержащих .svn/, поскольку оно не будет случайно отфильтровывать такие строки в реальном файле.

Ответ 9

Для grep версии 2.5.1 вы можете добавить несколько элементов --exclude для фильтрации файлов .svn.

$ grep -V | grep grep
grep (GNU grep) 2.5.1

GREP_OPTIONS="--exclude=*.svn-base --exclude=entries --exclude=all-wcprops" grep -l -R  whatever ./

Ответ 10

Другой вариант, хотя и не воспринимаемый как приемлемый ответ, - это клонирование репо в git и использование git grep.

Редко, я сталкиваюсь с svn-репозиториями, которые настолько массивны, что просто непрактично клонировать через git-svn. В этих редких случаях я использую двойное решение grep, svngrep, но, как показывает много ответов, это может быть медленным в больших хранилищах, и исключить ".svn" вхождения, которые не являются каталогами. Я бы сказал, что это было бы крайне редко, хотя...

Также в отношении медленной производительности нескольких greps, когда вы использовали что-то вроде git, почти все кажется медленным в svn!

Последняя вещь.., моя вариация svngrep проходит через раскраску, берегитесь, реализация уродлива! Примерно grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"

Ответ 11

Я думаю, что опция -exclude рекурсии - это то, что вы ищете.