Je veux traverser tous les sous-répertoires, sauf le répertoire "node_modules".
@Manocho : Si vous pensez ack
est génial, essayez The Silver Searcher et voyez l'augmentation de la vitesse !
Je veux traverser tous les sous-répertoires, sauf le répertoire "node_modules".
Les versions récentes de GNU Grep (>= 2.5.2 ) fournissent :
--exclude-dir=dir
qui exclut les répertoires correspondant au motif dir
des recherches récursives dans les répertoires.
Donc vous pouvez le faire :
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
Pour un peu plus d'informations concernant la syntaxe et l'utilisation, voir
Pour les anciens GNU Greps et Grep POSIX utiliser find
comme suggéré dans d'autres réponses.
Ou utilisez simplement ack
( Editar : ou Le chercheur d'argent ) et d'en finir !
@Manocho : Si vous pensez ack
est génial, essayez The Silver Searcher et voyez l'augmentation de la vitesse !
Syntaxe pour les impatients : --exclude-dir=dir
utiliza grep
Les modèles d'expressions régulières de l'UE, pas le globbing de fichiers de l'interpréteur de commandes. Les patrons fonctionnent sur des chemins relatifs à votre répertoire courant. Utilisez donc le motif --exclude-dir=dir
pas --exclude-dir="/root/dir/*"
.
SOLUTION 1 (combiner find
y grep
)
Le but de cette solution n'est pas de s'occuper de grep
mais pour montrer une solution portable : devrait aussi fonctionner avec busybox ou une version GNU plus ancienne que 2.5.
Utilisez find
pour exclure les répertoires foo et bar :
find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print
Ensuite, combinez find
et l'utilisation non-récurrente de grep
comme une solution portable :
find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;
SOLUTION 2 (en utilisant le --exclude-dir
option de grep
):
Vous connaissez déjà cette solution, mais je l'ajoute car c'est la solution la plus récente et la plus efficace. Notez que c'est une solution moins portable mais plus lisible par l'homme.
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
Pour exclure plusieurs répertoires, utilisez --exclude-dir
comme :
--exclude-dir={node_modules,dir1,dir2,dir3}
SOLUTION 3 (Ag)
Si vous cherchez fréquemment dans le code, Ag (Le chercheur d'argent) est une alternative beaucoup plus rapide à grep, qui est adaptée à la recherche de code. Par exemple, il ignore automatiquement les fichiers et les répertoires listés dans les champs .gitignore
Ainsi, vous n'avez pas besoin de passer les mêmes options d'exclusion encombrantes à l'adresse suivante grep
o find
.
Cette combinaison permet de faire des recherches plus rapidement que --exclude-dir=dir
et il montre les résultats avec des couleurs - facile à lire
"cette combinaison" find ... -exec
n'est pas plus rapide que grep --exclude-dir
pour moi. Un avantage énorme pour grep (environ cinq fois plus rapide avec 26k+ fichiers, filtrés sur 38k+ sur un disque dur), à moins que vous ne remplaciez l'option \;
con +
pour le combo find/exec. Grep n'est alors "que" 30% plus rapide. La syntaxe de grep est également lisible par l'homme :).
Ce n'est pas une si bonne solution dans certains cas. Par exemple : Si le répertoire 'node_modules' est énorme et contient beaucoup de faux positifs (d'où la nécessité de filtrer le répertoire), le premier grep perd beaucoup de temps à chercher dans un sous-répertoire, puis le second grep à filtrer les résultats. Il est plus rapide d'exclure node_modules dans le premier grep lui-même.
Idem pour le commentaire de Guru. Un grep de /var
s'accroche quand il frappe /var/run
dans mon cas. D'où la raison pour laquelle je veux éviter le répertoire en premier lieu.
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.
3 votes
Voir superuser.com/q/66715/59933
17 votes
Tapez simplement "man grep" et vous verrez les options --exclude, et --exclude-dir listées juste là - d'après le titre de cette question, je suppose que vous connaissez déjà grep....
77 votes
Si vous recherchez du code dans un dépôt git et que
node_modules
est dans votre.gitignore
,git grep "STUFF"
est le moyen le plus simple.git grep
recherche les fichiers suivis dans l'arbre de travail, en ignorant tout ce qui vient de.gitignore
7 votes
Un exemple pour le nœud :
grep -R --exclude-dir={node_modules,bower_components} "MyString" | cut -c1-"$COLUMNS"
-- De plus, vous pouvez toujours aliaser cette commande dans l'interpréteur de commandes avec 'nodegrep' ou autre et utiliser un argument de commande comme entrée de chaîne