Wenn ich alle HTML-Dateien in einem Verzeichnis durchsuchen möchte, gehe ich wie folgt vor
grep --include="*.html" pattern -R /some/path
das funktioniert gut. Das Problem ist, wie man alle HTML-, HTML- und PHP-Dateien in einem Verzeichnis erfasst.
Aus dieser Verwendung der Syntax grep --exclude / - include, um bestimmte Dateien nicht zu durchsuchen , kann ich anscheinend Folgendes tun
grep --include="*.{html,php,htm}" pattern -R /some/path
Aber leider würde es bei mir nicht funktionieren.
Zu Ihrer Information, meine grep-Version ist 2.5.1.
xargs
. Dies ist auch eine kurze Lektüre wert. HTH.*
steht noch unter Globbing als Teil der Token es in eingebettet ist , es ist einfach passiert , nicht zu Spiel etwas in diesem Fall, da nur Dateien buchstäblich einen Namen wie--include=foo.html
passen würde. Um sicher zu gehen, zitieren Sie das*
(was Sie individuell tun können\*
). Als zusätzlichen Bonus wird dadurch visuell klarer, dass in diesem Fall nicht die Shell das Globbing durchführen sollte.find
Lösung betrifft: Die Verwendung von-exec grep "pattern" {} +
anstelle von| xargs grep "pattern"
ist robuster (behandelt Dateinamen beispielsweise mit Leerzeichen) sowie effizienter.Unter Verwendung
{html,php,htm}
kann als nur arbeitet Klammer Erweiterung , die ein Nicht - Standard (nicht POSIX-konform) Merkmalbash
,ksh
undzsh
.Mit anderen Worten: Versuchen Sie nicht, es in einem Skript zu verwenden, das darauf abzielt.
/bin/sh
Verwenden Sie in diesem Fall explizite Mehrfachargumente--include
.grep
selbst nicht nicht verstehen{...}
Notation.Damit eine Klammererweiterung erkannt wird, muss es sich um ein nicht zitiertes (Teil eines) Tokens in der Befehlszeile handeln.
Eine Klammer Erweiterung dehnt sich mehrere Argumente , so im Fall zur Hand
grep
Enden nach oben sehen , mehrere--include=...
Optionen, wie wenn man sie einzeln vergangen war.Die Ergebnisse einer Klammererweiterung unterliegen einem Globbing (Dateinamenerweiterung) , das Fallstricke aufweist :
Jedes resultierende Argument könnte weiter auf übereinstimmende Dateinamen erweitert werden, wenn es nicht zitierte globale Zeichen enthält, wie z
*
.Während dies bei Token wie z. B.
--include=*.html
(z. B. müsste eine Datei buchstäblich so genannt werden ,--include=foo.html
damit etwas übereinstimmt) unwahrscheinlich ist, sollte dies im Allgemeinen beachtet werden.Wenn die
nullglob
Shell-Option zufälligshopt -s nullglob
aktiviert ist ( ) und Globbing mit nichts übereinstimmt , wird das Argument verworfen .Verwenden Sie daher für eine vollständig robuste Lösung Folgendes:
'--include=*.'
wird als wörtlich behandelt , weil es in einfachen Anführungszeichen steht ; Dies verhindert eine versehentliche Interpretation*
als Globbing-Charakter.{html,php,htm}
Die - notgedrungen - unquoted Verstrebung Expansion [1] , erweitert zu 3 Argumente, die aufgrund{...}
direkt die folgenden'...'
Token , umfassen die Token.Daher werden nach dem Entfernen des Anführungszeichens durch die Shell die folgenden 3 Literalargumente letztendlich an Folgendes übergeben
grep
:--include=*.html
--include=*.php
--include=*.htm
[1] Genauer gesagt müssen nur die syntaxrelevanten Teile der Klammererweiterung nicht in Anführungszeichen gesetzt werden. Die Listenelemente können weiterhin einzeln in Anführungszeichen gesetzt werden und müssen, wenn sie Globbing-Metazeichen enthalten, zu unerwünschtem Globbing nach der Klammererweiterung führen. Obwohl dies in diesem Fall nicht erforderlich ist, könnte das oben Gesagte als geschrieben werden
'--include=*.'{'html','php','htm'}
quelle
bash
auf jeder Plattform,bash
auf der sie ausgeführt wird.Versuchen Sie, die doppelten Anführungszeichen zu entfernen
quelle
grep --include=\*.{html,php,htm} pattern -R /some/path
. Es hat bei mir funktioniert.funktioniert das nicht
quelle
Versuche dies. -r führt eine rekursive Suche durch. -s unterdrückt Fehler, bei denen keine Datei gefunden wurde. -n zeigt Ihnen die Zeilennummer der Datei an, in der sich das Muster befindet.
quelle
-I
, das Standard-Set zu ergänzen. Es überspringt Binärdateien (die kaum durchsucht werden) und steigert so die Effizienz. Dann gehen wir,grep -rIns ...
was akustisch gut spielt :)Es funktioniert für den gleichen Zweck, aber ohne
--include
Option. Es funktioniert auch auf grep 2.5.1.quelle
Verwenden Sie
grep
mitfind
BefehlSie können
-regex
und-regextype
Optionen auch verwenden.quelle