191 votes

Exclure les répertoires .svn de la recherche Grep

Lorsque je fais une recherche avec grep dans mon répertoire de travail Subversion, les résultats incluent de nombreux fichiers des répertoires .svn. Est-il possible de faire une recherche récursive dans un répertoire, mais d'exclure tous les résultats des répertoires .svn ?

1 votes

273voto

psychoschlumpf Points 2091

Si vous avez GNU Grep, cela devrait fonctionner de cette manière :

grep --exclude-dir=".svn"

Si vous êtes sur un système Unix sans GNU Grep, essayez la commande suivante :

grep -R "ce que vous voulez" *|grep -v "\.svn/*"

6 votes

Sur la version Windows de GNU Grep, j'ai dû utiliser --exclude-dir=\.svn

18 votes

Seulement pour la version gnu grep >=2.5.1a

6 votes

Ha. Je m'apprêtais à voter pour mais j'avais déjà voté. Il semblerait que je sois déjà passé par là :)

40voto

osgx Points 28675

Pour grep >=2.5.1a

Vous pouvez le mettre dans votre environnement (par exemple, .bashrc)

export GREP_OPTIONS='--exclude-dir=".svn"'

PS : merci à Adrinan, il y a des guillemets supplémentaires dans ma version :

export GREP_OPTIONS='--exclude-dir=.svn'

PPS : Cette option d'environnement est marquée pour dépréciation : https://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html "Comme cela pose des problèmes lors de l'écriture de scripts portables, cette fonctionnalité sera supprimée dans une future version de grep, et grep avertit en cas d'utilisation. Veuillez utiliser un alias ou un script à la place."

2 votes

Vous n'avez pas besoin d'avoir des guillemets doubles - cela n'a pas fonctionné pour moi lorsque les guillemets doubles sont présents.

1 votes

GREP_OPTIONS a cessé d'être une variable d'environnement supportée après 2.20

36voto

Brian Agnew Points 143181

Si vous utilisez ack (un 'meilleur grep'), il gérera cela automatiquement (et fera beaucoup d'autres choses intelligentes aussi !). Ça vaut vraiment la peine de vérifier.

3 votes

+1 pour ack. J'ai un alias shell et je l'utilise par défaut.

9 votes

Vraiment sympa cet ack. Attention, sur Ubuntu et Linux Mint, le paquet "ack" n'a rien à voir avec l' "ack - better grep", qui se trouve dans le paquet "ack-grep".

0 votes

Malheureusement, cela n'a pas résolu le problème avec tous les répertoires cachés (par exemple, je ne veux pas qu'il descende dans le répertoire .stack-work), de plus je n'apprécie pas vraiment que sa sortie prenne plus de place en affichant les noms de fichiers sur une ligne séparée. J'ai donc fini par créer un alias pour grep alias grepexclhid="grep --exclude-dir=\".*\"".

7voto

Max Cantor Points 4486

Psychoschlumpf a raison, mais cela ne fonctionne que si vous avez la dernière version de grep. Les versions précédentes n'ont pas l'option --exclude-dir. Cependant, si vous avez une base de code très volumineuse, faire un double grep peut prendre une éternité. Ajoutez ceci dans votre .bashrc pour un grep portable sans .svn:

alias sgrep='find . -path "*/.svn" -prune -o -print0 | xargs -0 grep'

Maintenant, vous pouvez faire ceci:

sgrep some_var

... et obtenir les résultats attendus.

Bien sûr, si vous êtes une personne insensée comme moi qui doit absolument utiliser le même .bashrc partout, vous pourriez passer 4 heures à écrire une fonction bash compliquée à mettre à la place. Ou, vous pourriez simplement attendre qu'une personne insensée comme moi la poste en ligne:

http://gist.github.com/573928

0 votes

La méthode que vous avez mentionnée ci-dessus en utilisant find et xargs ne fonctionne pas, du moins sur RHEL5 dans mon environnement. Je continue à obtenir des listes de fichiers .svn-base.

2voto

karatedog Points 1011
grep --exclude-dir=".svn"

fonctionne car le nom ".svn" est plutôt unique. Mais cela peut échouer avec un nom plus généralisé.

grep --exclude-dir="work"

n'est pas infaillible, si vous avez "/home/user/work" et "/home/user/stuff/work" il sautera les deux. Il n'est pas possible de définir "/*/work/*" pour limiter l'exclusion uniquement au nom de dossier précédent. D'après mes expérimentations, dans GNU grep le simple --exclude n'exclut pas les répertoires.

1 votes

Uniquement pour la version gnu grep >=2.5.1a

0 votes

Cela devrait être un commentaire à la réponse acceptée, pas une réponse en soi.

0 votes

@Dave : Merci pour le conseil. Vous venez de commenter un commentaire vieux de 2 ans.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X