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?
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/*"
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'
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.
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 -grep
ing 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:
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.
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.
Deux greps feront l'affaire:
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
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'
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"
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 ./