1077 votes

Comment puis-je exclure des répertoires de grep -R ?

Je veux traverser tous les sous-répertoires, sauf le répertoire "node_modules".

3 votes

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

1319voto

Johnsyweb Points 45395

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 !

4 votes

@Manocho : Si vous pensez ack est génial, essayez The Silver Searcher et voyez l'augmentation de la vitesse !

47 votes

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/*" .

0 votes

Notez que si votre grep ne le supporte pas, vous pouvez utiliser ggrep

610voto

hornetbzz Points 1548

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 .

3 votes

Cette combinaison permet de faire des recherches plus rapidement que --exclude-dir=dir et il montre les résultats avec des couleurs - facile à lire

32 votes

"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 :).

0 votes

D'accord, puisque c'est évident. Certaines busybox ne disposent pas de la commande GREP.

9voto

DipSwitch Points 1774

Vous pourriez essayer quelque chose comme grep -R search . | grep -v '^node_modules/.*'

41 votes

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.

2 votes

Je ne me soucie pas de la lenteur, je peux regarder la commande et savoir ce qu'elle fait.

1 votes

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.

1voto

Jack Points 1
find . ! -name "node_modules" -type d

-5voto

Morris Points 61

Une façon plus simple serait de filtrer vos résultats en utilisant "grep -v".

grep -i needle -R * | grep -v node_modules

15 votes

Il s'agit en fait de la même réponse que celle fournie par DipSwitch trois ans plus tôt. Elle présente également les mêmes problèmes.

Prograide.com

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.

Powered by:

X