Comment puis-je exclure des répertoires de grep-R?
je veux parcourir tous les sous-répertoires, sauf le répertoire" node_modules".
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
.
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
- la page de GNU man pour sélection de fichiers et de répertoires
- Une relative StackOverflow réponse Utiliser grep --exclude/--la syntaxe de ne pas grep par le biais de certains fichiers
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!
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}
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
.
"
en le mettant ensemble, vous finissez avec quelque chose comme: 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 j'écris un script appelé Pour les exclusions de fichiers - je veux m'assurer que annuaire des exclusions - je tiens à exclure donc voici le résultat - je crée un script appelé 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
. grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>
debugger
pendant une session de débogage, et que je souhaite maintenant revoir / supprimer. findDebugger.sh
et j'utilise grep
pour trouver toutes les occurrences. Toutefois: .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. 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. findDebugger.sh
avec: #!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .
vous pourriez essayer quelque chose comme grep -R search . | grep -v '^node_modules/.*'
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
celui-ci travaille pour moi
grep <stuff> -R --exclude-dir=<your_dir>
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.
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"
une façon plus simple serait de filtrer vos résultats en utilisant"grep-v".
grep -i needle -R * | grep -v node_modules