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

je veux parcourir tous les sous-répertoires, sauf le répertoire" node_modules".

431
demandé sur TIMEX 2011-07-04 00:48:43

12 réponses

SOLUTION 1 (combiner find et grep )

le but de cette solution n'est pas de traiter la performance grep mais de montrer une solution portable : devrait également fonctionner avec busybox ou la version GNU plus ancienne que 2.5.

Use find , pour l'exclusion des annuaires foo et bar:

find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print

puis combiner find et l'utilisation non récursive de grep , comme solution portable:

find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

SOLUTION 2 (usage récursif de grep ):

vous connaissez déjà cette solution, mais je l'ajoute Car c'est la solution la plus récente et efficace. Remarque c'est moins portable solution mais plus lisible.

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

SOLUTION 3 (Ag)

si vous cherchez fréquemment à travers le code, Ag (le chercheur D'Argent) est une alternative beaucoup plus rapide que grep, qui est personnalisé pour la recherche de code. Par exemple , il ignore automatiquement les fichiers et répertoires énumérés dans .gitignore , de sorte que vous ne devez pas continuer à passer les mêmes options d'exclusion encombrantes à grep ou find .

145
répondu hornetbzz 2018-02-16 14:10:10

versions récentes de GNU Grep (>= 2.5.2 ) fournir:

--exclude-dir=dir

qui exclut les répertoires correspondant au modèle dir des recherches récursives dans les répertoires.

donc vous pouvez 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 Grep et POSIX Grep , utilisez find comme suggéré dans d'autres réponses.

ou utilisez ack ( Modifier : ou L'Argent Chercheur ) et être fait avec elle!

844
répondu Johnsyweb 2017-09-16 22:04:55

si vous voulez exclure plusieurs répertoires:

"r" pour les, "l" pour imprimer uniquement les noms de fichiers contenant des matchs et le "je" pour ignorer la casse des distinctions :


grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search

exemple : je veux trouver des fichiers qui contiennent le mot "hello". Je veux rechercher dans tous mes répertoires linux sauf proc répertoire, boot répertoire, sys répertoire et root répertoire:


grep -rli --exclude-dir={proc,boot,root,sys} hello /

Note : l'exemple ci-dessus doit être racine

Note 2 (selon @skplunkerin): ne pas ajouter d'espaces après les virgules {dir1,dir2,dir3}

59
répondu Azodium 2017-04-08 20:30:04

cette syntaxe

--exclude-dir={dir1,dir2}

est élargi par la coque (p.ex. Bash), et non par grep , en ceci:

--exclude-dir=dir1 --exclude-dir=dir2

citer empêchera le shell de l'étendre, donc cela ne fonctionnera pas:

--exclude-dir='{dir1,dir2}'    <-- this won't work

les motifs utilisés avec --exclude-dir sont le même type de motifs décrits dans la page de manuel pour l'option --exclude :

--exclude=GLOB
    Skip files whose base name matches GLOB (using wildcard matching).
    A file-name glob can use *, ?, and [...]  as wildcards, and \ to
    quote a wildcard or backslash character literally.

le shell sera généralement essayer pour développer un tel modèle lui-même, donc pour éviter cela, vous devez le citer:

--exclude-dir='dir?'

vous pouvez utiliser les accolades bouclées et exclure les motifs ensemble comme ceci:

--exclude-dir={'dir?','dir??'}

un modèle peut couvrir plusieurs segments de chemin:

--exclude-dir='some*/?lse'

cela exclurait un répertoire comme topdir/something/else .

17
répondu Derek Veit 2018-01-21 22:48:48

"

grep peut être utilisé en conjonction avec -r (récursif), i (ignorer le cas) et -o (tirages ne correspondant qu'à une partie des lignes). Pour exclure files utiliser --exclude et pour exclure les répertoires utiliser --exclude-dir .

en le mettant ensemble, vous finissez avec quelque chose comme:

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>

la décrire fait sonner loin plus compliqué qu'il ne l'est en réalité. Plus facile à illustrer avec un exemple simple.

exemple:

supposons que je cherche le projet courant pour tous les endroits où j'ai explicitement défini la valeur de la chaîne debugger pendant une session de débogage, et que je souhaite maintenant revoir / supprimer.

j'écris un script appelé findDebugger.sh et j'utilise grep pour trouver toutes les occurrences. Toutefois:

Pour les exclusions de fichiers - je veux m'assurer que .eslintrc est ignoré (il a fait un peluchage règle sur debugger , il doit être exclu). De même, je ne veux pas que mon propre script soit référencé dans les résultats.

annuaire des exclusions - je tiens à exclure node_modules comme il contient beaucoup de bibliothèques de référence debugger et je ne suis pas intéressé par ces résultats. Aussi je veux juste omettre .idea et .git caché répertoires parce que je ne me soucie pas de ces emplacements de recherche non plus, et souhaite garder la recherche performante.

donc voici le résultat - je crée un script appelé findDebugger.sh avec:

#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .
13
répondu arcseldon 2016-06-26 09:28:23

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

8
répondu DipSwitch 2011-07-03 20:53:18

très utile, surtout pour ceux qui traitent avec noeud.js où nous voulons éviter de chercher à l'intérieur de "node_modules":

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
4
répondu Nestor Urquiza 2016-02-11 21:00:55

celui-ci travaille pour moi

grep <stuff> -R --exclude-dir=<your_dir>

2
répondu angelo.mastro 2017-08-24 11:18:28

une simple commande de travail:

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

au-dessus de I grep for text "creativecommons.org "dans le répertoire courant" dspace " et exclure dirs {log,assetstore}.

fait.

2
répondu Dung 2017-08-24 14:23:54
find . ! -name "node_modules" -type d 
1
répondu Jack 2011-12-28 12:45:48

si vous récupérez du code dans un dépôt git et que node_modules se trouve dans votre .gitignore , vous pouvez utiliser git grep . git grep recherche les fichiers suivis dans l'arbre de travail, ignorant tout de .gitignore

git grep "STUFF"
1
répondu 0xcaff 2018-09-08 15:39:52

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

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

0
répondu Morris 2014-10-22 18:18:19