Utiliser grep --exclude/--la syntaxe de ne pas grep par le biais de certains fichiers

je cherche la chaîne de caractères foo= dans des fichiers texte dans un arborescence de répertoires. Il est sur une machine Linux commune, j'ai shell bash:

grep -ircl "foo=" *

Dans les répertoires sont également nombreux fichiers binaires qui "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 dois-je procéder?

je sais qu'il y a les options --exclude=PATTERN et --include=PATTERN , mais Quel est le format de 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 ne trouve rien de pertinent

S'il y a une meilleure façon de ne saisir que certains fichiers, Je suis pour; déplacer les fichiers offensants n'est pas une option. Je ne peux pas rechercher seulement certains répertoires (la structure des répertoires est un grand gâchis, avec tout partout). En outre, Je ne peux pas installer quoi que ce soit, donc je dois faire avec des outils communs (comme grep ou le suggéré trouver ).

670
demandé sur random 2008-10-21 17:41:01

22 réponses

utilisez la syntaxe de globbing de shell:

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

La syntaxe de --exclude est identique.

notez que l'étoile est échappée avec un antislash pour l'empêcher d'être étendue par le shell (le citer, comme --include="*.{cpp,h}" , fonctionnerait tout aussi bien). Dans le cas contraire, si vous aviez des fichiers dans le répertoire de travail courant qui correspondent au modèle, la ligne de commande serait étendue à quelque chose comme grep pattern -r --include=foo.cpp --include=bar.h rootdir , qui ne chercherait que des fichiers nommé foo.cpp et bar.h , qui est très probablement pas ce que vous vouliez.

635
répondu Adam Rosenfield 2011-12-14 22:53:57

si vous voulez simplement sauter des fichiers binaires, je vous suggère de regarder l'option -I (cas supérieur i). Il ignore les fichiers binaires. J'utilise régulièrement la commande suivante:

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

il fait des recherches récursives, ignore les fichiers binaires, et ne regarde pas dans les dossiers cachés de Subversion, quel que soit le motif que je veux. Je l'ai alias "grepsvn" sur ma boîte au travail.

199
répondu rmeador 2017-06-28 12:58:53

s'il vous Plaît prendre un coup d'oeil à ack , qui est conçu précisément pour ces situations. Votre exemple de

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

est fait avec ack comme

ack -icl "foo="

parce que ack ne regarde jamais dans 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
répondu Andy Lester 2008-10-21 14:18:19

grep 2.5.3 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 deuxième Andy voter pour ack si, c'est le meilleur.

32
répondu Corey 2017-05-23 11:47:25

j'ai trouvé cela après une longue période, Vous pouvez ajouter plusieurs inclut et exclut comme:

grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js
22
répondu Rushabh Mehta 2012-12-20 04:54:44

la commande suggérée:

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

est conceptuellement erroné, parce que --exclure des travaux sur le basename. En d'autres termes, il va sauter seulement le .svn dans le répertoire courant.

11
répondu 2008-12-17 18:56:38

grep 2.5.1, vous devez ajouter cette ligne dans ~/.bashrc ou ~/.profil bash

export GREP_OPTIONS="--exclude=\*.svn\*"
11
répondu deric 2010-04-01 10:13:14

je trouve la sortie de grep très utile parfois:

grep -rn "foo=" . | grep -v "Binary file"

cependant, cela ne l'empêche pas réellement de rechercher les fichiers binaires.

9
répondu Aaron Maenpaa 2008-10-21 13:44:45

sur CentOS 6.6 / Grep 2.6.3, je dois l'utiliser comme ceci:

grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"

constater l'absence de signe égal "=" (autrement --include , --exclude , include-dir et --exclude-dir sont ignorés)

7
répondu aesede 2014-11-07 18:43:19

si vous n'êtes pas opposé à l'utilisation de find , j'aime son -prune caractéristique: "151900920"

Sur la première ligne, vous spécifiez le répertoire que vous souhaitez rechercher. . (répertoire courant) est un chemin valide, par exemple.

sur les 2ème et 3ème lignes, utilisez "*.png" , "*.gif" , "*.jpg" , et ainsi de suite. Utilisez autant de ces constructions -o -name "..." -prune que vous avez des motifs.

sur la 4ème ligne, vous avez besoin d'un autre -o (il spécifie "ou" à find ), les modèles que vous voulez, et vous avez besoin soit d'un -print ou -print0 à la fin de celui-ci. Si vous voulez juste "tout le reste" qui reste après avoir taillé les *.gif , *.png , etc. images, puis utiliser -o -print0 et vous avez fini avec la 4ème ligne.

enfin, sur la 5ème ligne est la pipe à xargs qui prend chacun de ces fichiers résultants et les stocke dans une variable FILENAME . Il passe ensuite grep les drapeaux -IR , le "pattern" , puis FILENAME est élargi par xargs pour devenir cette liste de noms de fichiers trouvés par find .

pour votre question particulière, la déclaration peut ressembler à quelque chose comme: "151910920"

6
répondu OnlineCop 2011-11-15 18:28:16

je suis une dilettante, certes, mais voici comment mon ~/.bash_profile l'air:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

notez que pour exclure deux répertoires, j'ai dû utiliser --exclude-dir deux fois.

5
répondu 4D4M 2009-08-27 06:02:29

essayez celui-ci:

 $ find . -name "*.txt" -type f -print | xargs file | grep "foo=" | cut -d: -f1

fondée ici: http://www.unix.com/shell-programming-scripting/42573-search-files-excluding-binary-files.html

3
répondu Gravstar 2008-10-21 13:54:13

find et xargs sont vos amis. Utilisez-les pour filtrer la liste des fichiers plutôt que des grep -- exclude

Essayez quelque chose comme

find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="
2
répondu Andrew Stein 2008-10-21 13:45:26

ces scripts ne règlent pas tout le problème...Essayez mieux:

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n ""

ce script est tellement mieux, parce qu'il utilise des expressions régulières" réelles " pour éviter les répertoires de recherche. il suffit de séparer les noms de dossiers ou de fichiers avec "\ / " sur le grep-v

en profiter! trouvé sur mon shell linux! XD

2
répondu 2008-11-05 08:30:45

regardez @ celui-ci.

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
2
répondu suhas tawade 2011-11-20 00:57:46

si vous faites une recherche non-récursive, vous pouvez utiliser glop patterns pour faire correspondre les noms de fichiers.

grep "foo" *.{html,txt}

comprend html et txt. Il recherche dans le répertoire courant.

pour rechercher dans les sous-répertoires:

   grep "foo" */*.{html,txt}

dans les sous-répertoires:

   grep "foo" */*/*.{html,txt}
2
répondu Stéphane Laurent 2016-08-22 03:15:30

git grep

utiliser git grep qui est optimisé pour la performance et vise à rechercher à travers certains fichiers.

par défaut, il ignore les fichiers binaires et il honore votre .gitignore . Si vous ne travaillez pas avec la structure Git, vous pouvez toujours l'utiliser en passant --no-index .

exemple de syntaxe:

git grep --no-index "some_pattern"

pour plus d'exemples, voir:

2
répondu kenorb 2018-05-14 23:01:51

l'option --binary-files=without-match de GNU grep permet de sauter des fichiers binaires. (Équivalent à l'interrupteur -I mentionné ailleurs.)

(cela pourrait nécessiter une version récente de grep ; 2.5.3 l'a, au moins.)

1
répondu mjs 2009-04-07 11:04:44

adapté à tcsh .fichier d'alias:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

m'a pris un certain temps pour comprendre que la portion {mm,m,H,cc,C} ne devrait pas être entre guillemets. ~ Keith

1
répondu Keith Knauber 2012-04-02 17:52:48

dans les répertoires sont aussi de nombreux fichiers binaires. Je ne peux pas rechercher seulement certains répertoires (la structure des répertoires est un gros gâchis). Y a-t-il un meilleur moyen de ne graisser que dans certains fichiers?

ripgrep

c'est l'un des outils les plus rapides conçus pour effectuer une recherche récursive dans votre répertoire courant. Il est écrit dans Rust , construit sur le dessus de moteur regex de Rust pour une efficacité maximale. Vérifier le analyse détaillée ici .

donc vous pouvez juste exécuter:

rg "some_pattern"

il respecte votre .gitignore et sauter automatiquement les fichiers/répertoires cachés et les fichiers binaires.

vous pouvez toujours personnaliser inclure ou exclure des fichiers et des répertoires en utilisant -g / --glob . Les règles de Globbing correspondent à .gitignore globs. Vérifier man rg à l'aide.

pour plus d'exemples, voir: comment exclure certains fichiers qui ne correspondent pas à certaines extensions avec grep?

sur macOS, vous pouvez installer via brew install ripgrep .

1
répondu kenorb 2018-05-14 23:02:37

pour ignorer tous les résultats binaires de grep

grep -Ri "pattern" * | awk '{if( != "Binary") print "151900920"}'

la partie awk filtrera tout le fichier binaire foo correspond aux lignes

0
répondu lathomas64 2012-04-24 06:39:23

essayez ceci:

  1. créez un dossier nommé " --F " sous currdir ..(ou y relier un autre dossier renommé " --F " ie double-minus-F .
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *
-2
répondu P Stack 2012-12-07 16:11:32