Exclure.répertoires svn du grep [dupliquer]

cette question a déjà une réponse ici:

lorsque je récupère mon répertoire de copie de travail Subversion, les résultats incluent beaucoup de fichiers de la .svn répertoires. Est - il possible de récupérer recursivement un répertoire, mais exclure tous les résultats .svn répertoires?

184
demandé sur Tunaki 2009-09-29 13:33:41

11 réponses

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

grep --exclude-dir=".svn"

si vous utilisez un système Unix sans GNU Grep, essayez ce qui suit:

grep -R "whatever you like" *|grep -v "\.svn/*" 
264
répondu psychoschlumpf 2012-01-04 23:52:30

Si vous utilisez ack (un "mieux " grep"), il va gérer cela automatiquement (et beaucoup d'autres choses intelligentes!). C'est bien la peine de vérifier.

36
répondu Brian Agnew 2009-09-29 09:36:30

Pour grep >=2.5.1 un

vous pouvez mettre cela dans votre environnement (par exemple .bashrc )

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

PS: grâce à Adrinan, il y a des citations supplémentaires dans ma version:

export GREP_OPTIONS='--exclude-dir=.svn'
34
répondu osgx 2013-09-14 15:33:42

psychoschlumpf est correct, mais il 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 très grande base de code, double- grep -ing peut prendre une éternité. Déposez ceci dans votre .bashrc pour un .svn portable-Moins grep:

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

Maintenant vous pouvez le faire:

sgrep some_var

... et obtenir les résultats attendus.

bien sûr, si vous êtes un fou comme moi qui vient a d'utiliser le même .bashrc partout, vous pourriez passer 4 heures à écrire une fonction de bash trop compliquée à y mettre à la place. Ou , vous avez juste à attendre pour une personne folle comme moi de la mettre en ligne:

http://gist.github.com/573928

7
répondu Max Cantor 2010-09-10 16:30:03
grep --exclude-dir=".svn"

fonctionne parce que le nom ".svn " est assez unique. Mais cela pourrait échouer sur un nom plus général.

grep --exclude-dir="work"

n'est pas à l'épreuve des balles, si vous avez "/home/utilisateur/travail" et "/home/utilisateur/stuff/travail", elle va passer à la fois. Il n'est pas possible de définir des "/*/travail/*" limiter l'exclusion au seul nom de l'ancien dossier. Pour autant que je puisse l'expérimenter, dans GNU grep le simple --exclude n'exclura pas les répertoires.

2
répondu karatedog 2009-11-21 21:57:57

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 qui contiennent .svn/ car il ne serait pas accidentellement filtrer de telles lignes dans un fichier réel.

2
répondu user193130 2015-12-04 16:00:15

deux greps feront l'affaire:

  1. le premier grep aura tout.
  2. le second grep utilisera la sortie du premier grep comme entrée (via la tuyauterie). En utilisant le drapeau-v, grep sélectionnera les lignes qui ne correspondent pas aux termes de recherche. Le tour est joué. Il vous reste tous les uputs du premier grep qui ne contiennent pas .svn dans le chemin.

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

    grep the_text_you_want_to_search_for * | grep -v .svn
    
1
répondu Joseph Huttner 2010-05-11 17:02:35

j'ai essayé double grep'in sur ma base de code énorme et il a fallu une éternité donc j'ai obtenu cette solution avec l'aide de mon collègue

L'élagage est beaucoup plus rapide car il arrête de trouver du traitement de ces annuaires par rapport à 'grep-v' qui traite tout et exclut l'affichage des résultats

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

vous pouvez aussi alias cette commande dans votre .bashrc

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

Maintenant, utilisez simplement

sgrep 'whatever' 
1
répondu Sid Sarasvati 2013-07-15 03:13:02

une autre option, bien qu'elle ne puisse pas être perçue comme une réponse acceptable est de cloner la pension en git et d'utiliser git grep .

rarement, je tombe sur des dépôts svn qui sont si massifs, qu'il n'est pas pratique de cloner via git-svn . Dans ces rares cas, j'utilise une solution double grep, svngrep , mais comme beaucoup de réponses ici indiquent, cela pourrait être lent sur les grands dépôts, et exclure".SVN ' occurrences qui ne sont pas des répertoires. Je dirais que ces serait extrêmement rarement...

également en ce qui concerne la performance lente de plusieurs grep, une fois que vous avez utilisé quelque chose comme git, à peu près tout semble lent en svn!

une dernière chose.., ma variation de svngrep passe par la colorisation, attention, l'implémentation est laide! Environ grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"

1
répondu quickshiftin 2013-09-30 01:34:43

pour la version 2.5.1 de grep, vous pouvez ajouter plusieurs éléments --exclude pour filtrer les fichiers .svn .

$ 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
répondu ZaSter 2013-01-23 01:15:40

je pense que l'option --exclude de la récursion est ce que vous recherchez.

-1
répondu Patrice Bernassola 2009-09-29 09:43:56