Когда я grep мой каталог рабочей копии Subversion, результаты включают в себя большое количество файлов из каталогов .svn. Возможно ли рекурсивно grep каталоги, но исключить все результаты из .svn-каталогов?
Исключить каталоги .svn из grep
Ответ 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, чтобы вместо этого поставить там. Или, вы можете просто подождать, пока такой сумасшедший человек, как я, опубликует его онлайн:
Ответ 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 рекурсии - это то, что вы ищете.