Wyklucz ukryte podkatalogi z grep -r

22

Mam lokalną kopię svn, chcę wyszukać ciąg string some_string.

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

Ale jeśli pójdziemy trochę dalej, wydaje się, że ukryte katalogi pierwszego poziomu są wykluczone:

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

Jak mogę usunąć ukryte katalogi svn z mojego wyjścia, a nie tylko z pierwszego poziomu głębi?

$ grep some_string * -r --which_option_here?
lang/en:some_string=Some string
MUY Belgium
źródło
Nie jest to bezpośrednia odpowiedź, ale możesz spróbować potwierdzić .
depquid

Odpowiedzi:

21

Użyj --exclude-diropcji, np .:

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

Od man grep:

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

Zauważ jednak, że ta --exclude-diropcja jest dostępna tylko w GNU grep. Jeśli grepnie obsługuje tego, może być konieczne użycie innego narzędzia, na przykład :

find . \( -name .svn -prune \) -o -name "*" -exec grep -H "some_string" {} 2>/dev/null \;
jimmij
źródło
Muszę mieć za stary Linux ...
MUY Belgium
Zredagowałem odpowiedź, wypróbuj findwersję, jeśli twój grep nie obsługuje --exclude-dir.
jimmij
Mam wersję grep w wersji 2.5.1 i nie ma argumentu --exclude-dir, i próbowałem wszystkiego, o czym myślałem ...
MUY Belgium,
1
Drugie rozwiązanie nie działa --exclude-dir, czy próbowałeś?
jimmij
Mam „niezrealizowaną opcję”
MUY Belgium,
1

Zwykle używam tego:

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

${e%\./}usunie pierwszy, ./a następnie grepusunie wszystko, co zaczyna się od kropki.

Manuel
źródło
Kod mówi e#, tekst mówie%
Stephen Rauch