web-dev-qa-db-fra.com

Exclure les répertoires .svn de grep

Lorsque je grep mon répertoire de copie de travail Subversion, les résultats incluent un grand nombre de fichiers des répertoires .svn. Est-il possible de récursivement grep un répertoire, mais d'exclure tous les résultats des répertoires .svn?

188
Kees Kist

Si vous avez GNU Grep, cela devrait fonctionner comme ceci:

grep --exclude-dir=".svn"

Si cela se produit sur un système Unix sans GNU Grep, essayez ce qui suit:

grep -R "whatever you like" *|grep -v "\.svn/*" 
267
psychoschlumpf

Pour grep> = 2.5.1a

Vous pouvez l'insérer dans votre environnement (par exemple, .bashrc)

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

PS: grâce à Adrinan, ma version contient des citations supplémentaires:

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

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

36
Brian Agnew

psychoschlumpf est correct, mais cela ne fonctionne que si vous avez la dernière version de grep. Les versions précédentes n'ont pas le --exclude-dir option. Cependant, si vous avez une très grande base de code, le double -greping peut prendre une éternité. Déposez ceci dans votre .bashrc pour un portable .svn- moins grep:

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

Maintenant vous pouvez faire ceci:

sgrep some_var

... et obtenir les résultats escomptés.

Bien sûr, si vous êtes un fou, comme moi, il suffit d'utiliser le même .bashrc _ partout, vous pourriez passer 4 heures à écrire une fonction bash trop compliquée pour la mettre à la place. Ou , vous pouvez simplement attendre qu'une personne aliénée comme moi la poste en ligne:

http://Gist.github.com/573928

7
Max Cantor
grep --exclude-dir=".svn"

fonctionne parce que le nom ".svn" est plutôt unique. Mais cela pourrait échouer sur un nom plus généralisé.

grep --exclude-dir="work"

n'est pas à l'épreuve des balles, si vous avez "/ home/user/work" et "/ home/user/stuff/work", les deux seront ignorés. Il n'est pas possible de définir "/ */work/*" pour limiter l'exclusion à l'ancien nom de dossier. Autant que j'ai pu expérimenter, dans GNU grep, le simple --exclude n'exclut pas les répertoires.

2
karatedog

Sur mon GNU grep 2.5, --exclude-dirs n'est pas une option valide. Comme alternative, cela a bien fonctionné pour moi:

grep --exclude="*.svn-base"

Cela devrait être une meilleure solution que d’exclure toutes les lignes contenant .svn/ car il ne filtrerait pas accidentellement de telles lignes dans un fichier réel.

2
user193130

Deux greps feront l'affaire:

  1. Le premier GREP obtiendra tout.
  2. Le second grep utilisera la sortie du premier grep comme entrée (via la tuyauterie). En utilisant l'indicateur -v, grep sélectionnera les lignes ne correspondant pas aux termes de la recherche. Voila. Il vous reste toutes les sorties du premier grep qui ne contiennent pas .svn dans le chemin du fichier.

    -v, --invert-match Inverse le sens de la correspondance pour sélectionner des lignes non correspondantes.

     grep the_text_you_want_to_search_for * | grep -v .svn 
    
1
Joseph Huttner

J'ai essayé le double grep'in sur mon énorme base de code et cela a pris une éternité. J'ai donc eu cette solution avec l'aide de mon collègue.

L'élagage est beaucoup plus rapide car il cesse de traiter ces répertoires par rapport à 'grep -v' qui traite tout et n'exclut que l'affichage des résultats.

find . -name .svn -Prune -o -type f -print0 | xargs -0 egrep 'YOUR STRING'

Vous pouvez aussi aliaser cette commande dans votre .bashrc en tant que

alias sgrep='find . -name .svn build -Prune -o -type f -print0 | xargs -0 egrep '

Maintenant, utilisez simplement

sgrep 'whatever' 
1
Sid Sarasvati

Une autre option, bien que celle qui ne soit pas perçue comme une réponse acceptable , consiste à cloner le rapport dans git et à utiliser git grep.

Rarement, je tombe sur des dépôts svn qui sont si énormes, il est tout simplement impossible de cloner via git-svn. Dans ces rares cas, j'utilise une solution double grep, svngrep , mais comme l'indiquent de nombreuses réponses, cela pourrait être lent sur les grands référentiels et exclure les occurrences ".svn" qui ne sont pas des répertoires. Je dirais que ce serait extrêmement rarement si ...

Également en ce qui concerne les performances lentes de plusieurs greps, une fois que vous avez utilisé quelque chose comme Git, tout semble lent en svn!

Une dernière chose .., ma variation de svngrep passe par la colorisation, méfiez-vous, la mise en œuvre est laide! Grossièrement grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"

1
quickshiftin

Pour grep version 2.5.1, vous pouvez ajouter plusieurs --exclude éléments pour filtrer le .svn des dossiers.

$ grep -V | grep grep
grep (GNU grep) 2.5.1

GREP_OPTIONS="--exclude=*.svn-base --exclude=entries --exclude=all-wcprops" grep -l -R  whatever ./
0
ZaSter