Виключіть приховані підкаталоги з 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

Чи не пряма відповідь, але ви можете спробувати винищені .
depquid

Відповіді:


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 \;

У мене повинен бути занадто старий Linux ...
МУЙ Бельгія

Я відредагував відповідь, спробуйте findверсію, якщо ваша греп не підтримує --exclude-dir.
jimmij

У мене є версія grep версії 2.5.1, і немає аргументу --exclude-dir, і я перепробував усе, про що думав ...
МУЙ Бельгія

1
Друге рішення не використовується --exclude-dir, ви пробували?
jimmij

У мене є "непризнаний варіант"
МУЙ Бельгія

1

Я зазвичай використовую це:

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

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


Код говорить e#, текст говоритьe%
Стівен Рауч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.