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

182

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

Теги:
grep
svn

11 ответов

242
Лучший ответ

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

grep --exclude-dir=".svn"

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

grep -R "whatever you like" *|grep -v "\.svn/*" 
  • 6
    В версии GNU Grep для Windows мне пришлось использовать --exclude-dir=\.svn
  • 18
    Только для версии GNU grep> = 2.5.1a
Показать ещё 6 комментариев
36

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

  • 3
    +1 за кв. У меня есть псевдоним оболочки и я использую его по умолчанию.
  • 9
    Действительно приятно, что ack. Обратите внимание, что в Ubuntu и Linux Mint пакет «ack» не имеет ничего общего с «ack - better grep», который находится в пакете «ack-grep».
Показать ещё 1 комментарий
33

Для grep >= 2.5.1a

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

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

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

export GREP_OPTIONS='--exclude-dir=.svn'
  • 2
    Вам не нужно иметь двойную кавычку - у меня не получилось, когда присутствует двойная кавычка
7

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

  • 0
    Метод, который вы перечислили выше с использованием find и xargs, не работает, по крайней мере, на RHEL5 в моей среде. Я все еще получаю списки .svn-base.
  • 0
    для меня это тоже не работает
2
grep --exclude-dir=".svn"

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

grep --exclude-dir="work"

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

  • 1
    Только для версии GNU grep> = 2.5.1a
  • 0
    Это должен быть комментарий к принятому ответу, а не сам по себе ответ.
Показать ещё 1 комментарий
1

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

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

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

  • 0
    Вы заметили разницу, это --exclude-dir no --exclude-dirs ?
1

Я попробовал двойной 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' 
1

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

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

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

    grep the_text_you_want_to_search_for * | grep -v .svn
    
  • 1
    Второй grep удаляет все цветовое форматирование.
  • 1
    Другая проблема состоит в том, что он удалит все строки, в которых есть «.svn», независимо от того, является ли .svn из-за имени файла или фактически находится в файле. Другая проблема заключается в том, что вы тратите время на поиск файлов в каталоге .svn, которые, как вы знаете, вы собираетесь исключить. Лучше - исключить с самого начала.
Показать ещё 1 комментарий
0

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

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

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

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

0

Для 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 ./
0

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

  • 2
    --exclude только шаблонам файлов, например *.java

Ещё вопросы

Сообщество Overcoder
Наверх
Меню