Question Utiliser la syntaxe grep --exclude / - pour ne pas grep certains fichiers


Je cherche la chaîne foo= dans les fichiers texte dans une arborescence de répertoires. C'est sur une machine Linux commune, j'ai bash shell:

grep -ircl "foo=" *

Dans les répertoires, il y a aussi beaucoup de fichiers binaires qui correspondent à "foo =". Comme ces résultats ne sont pas pertinents et ralentissent la recherche, je veux que grep saute la recherche de ces fichiers (principalement des images JPEG et PNG). Comment ferais-je cela?

Je sais qu'il y a --exclude=PATTERN et --include=PATTERN options, mais quel est le format du modèle? La page de manuel de grep dit:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

Recherche sur grep inclure, grep inclure exclure, grep exclure et les variantes n'ont rien trouvé de pertinent

S'il y a une meilleure façon de faire grimper seulement dans certains fichiers, je suis tout à fait pour; déplacer les fichiers incriminés n'est pas une option. Je ne peux pas rechercher seulement certains répertoires (la structure du répertoire est un gros gâchis, avec tout partout). En outre, je ne peux rien installer, donc je dois faire avec des outils communs (comme grep ou le suggéré trouver).


660
2017-10-21 13:41


origine


Réponses:


Utilisez la syntaxe de globbing du shell:

grep pattern -r --include=\*.{cpp,h} rootdir

La syntaxe pour --exclude est identique.

Notez que l'étoile est échappée avec un antislash pour l'empêcher d'être étendue par le shell (en le citant, comme --include="*.{cpp,h}", fonctionnerait aussi bien). Sinon, si vous aviez des fichiers dans le répertoire de travail en cours correspondant au modèle, la ligne de commande s'étendrait à quelque chose comme grep pattern -r --include=foo.cpp --include=bar.h rootdir, qui ne rechercherait que les fichiers nommés foo.cpp et bar.h, ce qui n'est probablement pas ce que vous vouliez.


623
2017-10-21 13:44



Si vous voulez juste ignorer les fichiers binaires, je vous suggère de regarder le -I (majuscule i) option. Il ignore les fichiers binaires. J'utilise régulièrement la commande suivante:

grep -rI --exclude-dir="\.svn" "pattern" *

Il recherche récursivement, ignore les fichiers binaires, et ne regarde pas dans les dossiers cachés de Subversion, quel que soit le modèle que je veux. Je l'ai alias comme "grepsvn" sur ma boîte au travail.


198
2017-10-21 14:12



S'il vous plaît jeter un oeil à ack, qui est conçu pour exactement ces situations. Votre exemple de

grep -ircl --exclude=*.{png,jpg} "foo=" *

est fait avec ack comme

ack -icl "foo="

car ack ne regarde jamais les fichiers binaires par défaut et -r est activé par défaut. Et si vous voulez seulement des fichiers CPP et H, alors faites

ack -icl --cpp "foo="

54
2017-10-21 14:18



grep 2.5.3 a introduit le paramètre --exclude-dir qui fonctionnera comme vous le souhaitez.

grep -rI --exclude-dir=\.svn PATTERN .

Vous pouvez également définir une variable d'environnement: GREP_OPTIONS = "- exclude-dir = .svn"

Je vais seconder Andy voter pour ack cependant, c'est le meilleur.


32
2018-02-04 18:41



J'ai trouvé cela après un long moment, vous pouvez ajouter plusieurs inclus et exclut comme:

grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js

22
2017-12-20 04:54



La commande suggérée:

grep -Ir --exclude="*\.svn*" "pattern" *

est conceptuellement faux, car --exclude fonctionne sur le nom de base. Autrement dit, il ne passera que le .svn dans le répertoire courant.


11
2017-12-17 18:56



Dans grep 2.5.1 vous devez ajouter cette ligne au profil ~ / .bashrc ou ~ / .bash

export GREP_OPTIONS="--exclude=\*.svn\*"

11
2018-04-01 10:13