Je veux trouver toutes les occurrences de foo
dans un grand système de fichiers géré par SVN mais je ne veux pas faire correspondre quelque chose contenu dans un .svn
répertoire.
J'obtiens des correspondances immédiates quand je le fais, grep -l -e 'foo' *
mais quand j'essaie d'exclure les répertoires svn avec grep -l -e 'foo' --exclude-dir=".svn"
la commande se bloque simplement.
Qu'est-ce que je fais mal?
*
à.
, au cas où il y aurait d'autres dossiers cachés qui devraient être recherchés.--recursive .
place, car l'OP a déjà GNUgrep
.shopt -s dotglob
dans Bash, donc*
contient déjà des fichiers dot.-r
est sympa, mais leack
fait aussi par défaut :)Vous pourriez être intéressé par ack . Il effectue une recherche récursive (et d'autres opérations de type grep) et exclut les répertoires tels que .svn ou .git par défaut.
la source
ag
, qui est similaire, mais plus rapide.La
grep --exclude-dir...
solution doit être très bien, mais juste pour montrer une autre façon, vous pouvez le faire avecfind
« s-prune
:Si vous voulez exécuter quelque chose de plus,
find
c'est mieux qu'une simplegrep -r
:la source
Si vous ne voulez pas grep dans des répertoires comme
.svn
jamais, vous pouvez définir la$GREP_OPTIONS
variable pour l'exclure comme ci-dessous:Ajoutez simplement cette ligne à votre
.bashrc
et vos greps récursifs n'entreront plus dans les.svn
répertoires. Bien sûr, il peut être aussi riche que vous le souhaitez:la source
Voici également une solution awk:
Fondamentalement, à partir de tous les fichiers, élaguez ceux qui correspondent à /.svn/ puis, parmi ceux-ci, imprimez uniquement ceux qui correspondent à / foo /. J'aime aussi cette solution car vous pouvez facilement utiliser les résultats avec ls. Par exemple, vous pouvez utiliser
pour voir une vue de liste triée par date de modification. Aussi, c'est bien d'avoir le chemin complet des résultats si vous voulez faire autre chose avec eux (les ouvrir, les exécuter, etc.)
la source