Исключить скрытые подкаталоги из grep -r

22

У меня есть локальная копия SVN, я хочу сделать поиск по строке some_string.

$ grep some_string * -r
lang/en:some_string=Some string
lang/.svn/en:some_string=Some string

Но если пойти немного дальше, кажется, что скрытые каталоги первого уровня исключены:

$ cd lang && grep some_string * -r
en:some_string=Some string

Как я могу удалить скрытые каталоги SVN из моего вывода, а не только с первого уровня глубины?

$ grep some_string * -r --which_option_here?
lang/en:some_string=Some string
MUY Бельгия
источник
Не прямой ответ, но вы можете попробовать ack .
Депвид

Ответы:

21

Используйте --exclude-dirопцию, например:

grep -r --exclude-dir='.*' some_string

От man grep:

--exclude-dir=DIR
              Exclude directories matching the pattern DIR from recursive searches.

Обратите внимание, что эта --exclude-dirопция доступна только в GNU grep. Если ваш grepне поддерживает его, вам может понадобиться другой инструмент, как найти, например :

find . \( -name .svn -prune \) -o -name "*" -exec grep -H "some_string" {} 2>/dev/null \;
jimmij
источник
У меня должен быть слишком старый Linux ...
MUY Belgium,
Я отредактировал ответ, попробуйте findверсию, если ваш grep не поддерживает --exclude-dir.
Джимми
У меня есть версия 2.5.1 grep, и нет аргумента --exclude-dir, и я попробовал все, о чем думал ...
MUY Бельгия,
1
Второе решение не использует --exclude-dir, вы пробовали это?
Джимми
У меня есть «нереализованный вариант»
MUY Бельгия,
1

Я обычно использую это:

for e in $(find . -maxdepth 1 -type d); do echo ${e#\./}; done | grep -v '^\.'

${e%\./}удалит первое, ./а затем grepудалит все, что начинается с точки.

Manuel
источник
Код говорит e#, текст говоритe%
Стивен Раух