In bash möchte ich den Dateinamen (und den Pfad zur Datei) für jede Datei vom Typ zurückgeben, .php|.html|.js
die die Zeichenfolge enthält, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird"document.cookie" | "setcookie"
Wie würde ich das machen?
Antworten:
Das
r
Flag bedeutet rekursives Suchen (Suchunterverzeichnisse). Diei
Flagge bedeutet, dass die Groß- und Kleinschreibung nicht berücksichtigt wird.Wenn Sie nur Dateinamen möchten, fügen Sie das Flag
l
(KleinbuchstabenL
) hinzu:quelle
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
auf Ubuntu Desktop 16 erhalten. irgendwelche Hinweise?--include=\*.{php,html,js}
Versuchen Sie etwas wie
grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
das
-i
macht es fallunempfindlichDas
.
am Ende bedeutet, dass Sie von Ihrem aktuellen Verzeichnis aus starten möchten. Dies kann durch ein beliebiges Verzeichnis ersetzt werden.Die
-r
Mittel tun dies rekursiv, direkt im VerzeichnisbaumDas
-n
druckt die Zeilennummer für Übereinstimmungen.Mit
--include
können Sie Dateinamen und Erweiterungen hinzufügen. Platzhalter akzeptiertWeitere Informationen finden Sie unter: http://www.gnu.org/software/grep/
quelle
-l
Option (drucken Sie einfach passende Dateinamen) anstelle von-n
find
sie undgrep
für die Zeichenfolge:Dadurch finden Sie alle Dateien Ihrer 3 Typen in / launch / path und grep für den regulären Ausdruck
'(document\.cookie|setcookie)'
. Auf 2 Zeilen mit dem Backslash nur zur besseren Lesbarkeit aufteilen ...quelle
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
auf ~ 500Gb Gewicht Verzeichnis.Klingt nach einem perfekten Job für
grep
oder vielleicht ackOder diese wunderbare Konstruktion:
quelle
-exec grep...
ist besser als meinexargs
Methode, da Leerzeichen in Dateinamen nicht erstickt werden.find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Natürlich können auch die anderen Optionen hinzugefügt werden.quelle
Um noch eine Alternative aufzunehmen, können Sie auch Folgendes verwenden:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
Wo:
-regextype posix-extended
gibt an,find
welche Art von Regex zu erwarten ist-regex "^.*\.(php|html|js)$"
teiltfind
dem regulären Ausdruck selbst mit, dass Dateinamen übereinstimmen müssen-exec grep -EH '(document\.cookie|setcookie)' {} \;
weistfind
an, den Befehl (mit seinen Optionen und Argumenten) auszuführen, der zwischen der-exec
Option und der\;
für jede gefundene Datei angegeben ist, wobei angegeben wird{}
, wohin der Dateipfad in diesem Befehl führt.während
E
Option weistgrep
an, erweiterten regulären Ausdruck zu verwenden (um die Klammern zu unterstützen) und ...H
Option weistgrep
an, Dateipfade vor den Übereinstimmungen zu drucken.Wenn Sie nur Dateipfade möchten, können Sie Folgendes verwenden:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u
Wo
|
[pipe] sendet die Ausgabe vonfind
an den nächsten Befehl danach (wassed
dann istsort
)r
Option weistsed
an, erweiterten regulären Ausdruck zu verwenden.s/HI/BYE/
weistsed
an, jedes erste Vorkommen (pro Zeile) von "HI" durch "BYE" und ... zu ersetzen.s/(^.*):.*$/\1/
fordert es auf, den regulären Ausdruck zu ersetzen(^.*):.*$
(dh eine Gruppe [eingeschlossenes Zeug()
], die alles [.*
= ein oder mehrere Zeichen eines beliebigen Zeichens] vom Anfang der Zeile [^
] bis zum 'ersten' enthält: 'gefolgt von irgendetwas bis zum Ende von Zeile [$
]) durch die erste Gruppe [\1
] des ersetzten regulären Ausdrucks.u
Weist sort an, doppelte Einträge zu entfernen (sort -u
optional).... bei weitem nicht der eleganteste Weg. Wie gesagt, meine Absicht ist es, das Spektrum der Möglichkeiten zu erweitern (und auch ausführlichere Erklärungen zu einigen Tools zu geben, die Sie verwenden könnten).
quelle