Wie verwende ich die Option grep --include für mehrere Dateitypen?
Wenn ich will, grep, alle html-Dateien in ein Verzeichnis, ich habe das folgende
grep --include="*.html" pattern -R /some/path
die gut funktioniert. Das problem ist, wie man grep alle html,htm,php-Dateien in einem Verzeichnis?
Aus diesem Mit grep --exclude/--include-syntax für grep nicht über bestimmte Dateienes scheint, dass ich tun kann, folgende
grep --include="*.{html,php,htm}" pattern -R /some/path
Aber leider funktioniert es nicht für mich.
FYI, meine grep-version ist 2.5.1.
InformationsquelleAutor der Frage tianyapiaozi | 2012-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie mehrere
--include
flags. Dies funktioniert für mich:grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/
Jedoch können Sie als
Deruijter
vorgeschlagen. Dies funktioniert für mich:grep -r --include=*.{html,php,htm} "pattern" /some/path/
Vergessen Sie nicht, dass Sie verwenden können
find
undxargs
für diese Art der Sache zu:find /some/path/-name "*.htm*" -or -name "*.php" | xargs grep "pattern"
HTH
InformationsquelleAutor der Antwort Steve
Mit
{html,php,htm}
nur funktionieren kann, als ein brace expansiondie einen nicht standardmäßigen (nicht POSIX-konform) - Funktion vonbash
ksh
undzsh
.In anderen Worten: versuchen Sie nicht, um es in einem Skript, dass die Ziele
/bin/sh
- Nutzung explizite mehrere--include
Argumente in diesem Fall.grep
selbst hat nicht verstehen{...}
notation.Für ein brace expansion erkannt zu werden, es muss ein nicht börsennotierten (Teil a) token auf der Kommandozeile.
Brace expansion erweitert, um mehrere Argumentealso in dem Fall bei der hand
grep
endet zu sehen mehrere--include=...
Optionen, gerade als ob Sie hatte, übergeben Sie Sie einzeln.Die Ergebnisse von brace expansion sind unterliegen Platzhalter (Dateinamen-expansion)die Fallstricke:
Jede daraus resultierende argument könnte noch erweitert werden, um die passenden Dateinamen, wenn es passiert, zu enthalten nicht börsennotierten Platzhalter Metazeichen wie
*
.Dies ist zwar unwahrscheinlich, mit Token wie
--include=*.html
(z.B., du müsstest eine Datei haben wörtlich benannt etwas wie--include=foo.html
für etwas Spiel), es lohnt sich, im Auge zu behalten, im Allgemeinen.Wenn die
nullglob
option shell passiert eingeschaltet werden (shopt -s nullglob
) und Platzhalter entspricht nichtsdas argument wird verworfen.Daher für ein vollständig zuverlässige Lösungverwenden Sie die folgende:
'--include=*.'
behandelt wird wie ein wörtlicheaufgrund single-quoted; dies verhindert die unbeabsichtigte interpretation von*
als Platzhalter-Zeichen.{html,php,htm}
die - notwendigerweise - nicht börsennotierten brace expansion[1]erweitert um 3 Argumente, die aufgrund
{...}
direkt nach der'...'
token, gehören, dass token.Daher nach dem Zitat entfernen, indem Sie die Schale, die folgenden 3 wörtliche Argumente sind letztlich übergeben
grep
:--include=*.html
--include=*.php
--include=*.htm
[1] genauer gesagt, es ist nur der syntax-relevante Teile der brace expansion werden müssen, ohne Anführungszeichen, die Liste Elemente kann noch werden einzeln angeboten und müssen, wenn Sie enthalten Platzhalter Metazeichen könnte dazu führen, unerwünschten Platzhalter nach dem brace-expansion, während nicht erforderlich in diesem Fall kann das obige wie folgt geschrieben werden
'--include=*.'{'html','php','htm'}
InformationsquelleAutor der Antwort mklement0
Versuchen, das entfernen der Anführungszeichen
InformationsquelleAutor der Antwort Deruijter
ist dieses nicht funktioniert?
InformationsquelleAutor der Antwort Vijay
Versuchen.
-r wird eine rekursive Suche.
-s unterdrückt wird Datei nicht gefunden Fehler.
-n zeigen Sie die Nummer der Zeile der Datei, wo das Muster gefunden wird.
InformationsquelleAutor der Antwort Pradeep
Verwenden
grep
mitfind
BefehlKönnen Sie
-regex
und-regextype
Möglichkeiten zu.InformationsquelleAutor der Antwort Prince John Wesley