Exclure les sous-répertoires cachés de grep -r


22

J'ai une copie locale svn, je veux faire une recherche sur la chaîne some_string.

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

Mais si on va un peu plus loin, il semble que les répertoires cachés de premier niveau soient exclus:

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

Comment puis-je supprimer les répertoires svn cachés de ma sortie, et pas seulement du premier niveau de profondeur?

$ grep some_string * -r --which_option_here?
lang/en:some_string=Some string

Pas une réponse directe, mais vous voudrez peut-être essayer d' ack .
depquid

Réponses:


21

Utilisez l' --exclude-diroption, par exemple:

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

De man grep:

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

Notez cependant que cette --exclude-diroption n'est disponible que dans GNU grep. Si votre grepne le supporte pas, vous devrez peut-être utiliser un autre outil comme find par exemple :

find . \( -name .svn -prune \) -o -name "*" -exec grep -H "some_string" {} 2>/dev/null \;

Je dois avoir un Linux trop vieux ...
MUY Belgium

J'ai édité la réponse, essayez la findversion si votre grep ne prend pas en charge --exclude-dir.
jimmij

J'ai la version grep version 2.5.1, et il n'y a pas d'argument --exclude-dir, et j'ai essayé tout ce à quoi je pensais ...
MUY Belgium

1
La deuxième solution ne fonctionne pas --exclude-dir, l'avez-vous essayée?
jimmij

J'ai une "option non reconnue"
MUY Belgique

1

J'utilise normalement ceci:

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

${e%\./}supprimera le premier ./, puis grepsupprimera tout ce qui commence par un point.


Le code dit e#, le texte dite%
Stephen Rauch
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.