2009-09-29 6 views
182

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

+1

Связанный [Как я могу исключить каталоги из grep -R?] (Http://stackoverflow.com/questions/6565471/how-can-i-exclude-directories-from-grep-r) –

ответ

256

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

grep --exclude-dir=".svn" 

Если случится быть на системе Unix без GNU Grep, попробуйте следующее:

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

В версии Windows GNU Grep мне пришлось использовать '--exclude-dir = \. Svn' –

+18

Только для gnu grep version> = 2.5.1a – osgx

+5

ha. Я был почти готов, но у меня уже было. кажется, я был здесь раньше :) –

36

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

+2

+1 для ack , У меня есть псевдоним оболочки и использовать его по умолчанию. –

+8

Действительно приятно, что ак. Осторожно, что в Ubuntu и Linux Mint пакет «ack» не имеет ничего общего с «ack - better grep», который находится в пакете «ack-grep». –

+0

Это, к сожалению, не решило проблему с * all * hidden dirs * (например, я не хочу, чтобы он спустился в '.stack-work' dir) *, также мне не очень понравилось, что его вывод занимает больше места имеющих имена файлов на отдельной строке. Поэтому в итоге я получаю псевдоним grep 'alias grepexclhid =" grep --exclude-dir = \ ". * \" "'. –

-1

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

+2

'--exclude' соответствует только шаблонам файлов, например' * .java' – rymo

2
grep --exclude-dir=".svn" 

работает, потому что имя «.svn» является довольно уникальным. Но это может потерпеть неудачу по более обобщенному имени.

grep --exclude-dir="work" 

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

+1

Только для gnu grep version> = 2.5.1a – osgx

+0

Это должен быть комментарий к принятому ответу, а не сам ответ. – Dave

+0

@ Dave: Спасибо за подсказку. Вы только что прокомментировали 2-летний комментарий. – karatedog

1

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

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

    -v, -invert-match Инвертировать чувство соответствия, чтобы выбрать не соответствующие линии.

     
    grep the_text_you_want_to_search_for * | grep -v .svn 
    
+1

Второй grep удаляет все форматирование цвета. – Chandranshu

+1

Другая проблема заключается в том, что она удалит любые строки, которые имеют «.svn» в них, независимо от того, является ли .svn из-за имени файла или фактически находится в файле. Другая проблема заключается в том, что вы тратите время на поиск файлов в каталоге .svn, которые, как вы знаете, собираетесь исключить. Лучше - с самого начала. –

+0

Это также будет тратить время на поиск совпадений в .svn только для их фильтрации после факта. – spaaarky21

7

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

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

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

sgrep some_var 

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

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

http://gist.github.com/573928

+0

Метод, указанный выше с помощью find и xargs, не работает, по крайней мере, на RHEL5 в моей среде. Я все еще получаю списки .svn-base. – coderintherye

+0

для меня это тоже не работает –

34

Для Grep> = 2.5.1a

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

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

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

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

Вам не нужно иметь двойную кавычку - это не работало для меня, когда присутствует двойная кавычка –

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' 
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 ./ 
1

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

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

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

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

2

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

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

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

Смежные вопросы