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 ).
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.
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.
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="
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 "
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
grep 2.5.1, vous devez ajouter cette ligne dans ~/.bashrc ou ~/.profil bash
export GREP_OPTIONS="--exclude=\*.svn\*"
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.
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)
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"
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.
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
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="
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
regardez @ celui-ci.
grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
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}
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:
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.)
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
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
.
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
essayez ceci:
- créez un dossier nommé "
--F
" sous currdir ..(ou y relier un autre dossier renommé "--F
" iedouble-minus-F
. -
#> grep -i --exclude-dir="\-\-F" "pattern" *