Wenn ich im aktuellen Verzeichnis eine rekursive grep-Suche durchführen möchte, mache ich normalerweise Folgendes:
grep -ir "string" .
Dieser Befehl durchsucht jedoch alle Arten von Dateien, einschließlich Binärdateien (Bilder, Audio, Video usw.), was zu einem sehr langsamen Suchprozess führt.
Wenn ich das zum Beispiel mache, funktioniert es nicht:
grep -ir "string" *.php
Dies funktioniert nicht, da sich im aktuellen Verzeichnis keine PHP-Dateien befinden, sich jedoch in einigen Unterverzeichnissen des aktuellen Verzeichnisses befinden und die Namen der Unterverzeichnisse nicht mit ".php" enden, sodass grep nicht in ihnen nachschaut.
Wie kann ich also eine rekursive Suche im aktuellen Verzeichnis durchführen, aber auch Platzhalter für Dateinamen angeben? (dh nur in Dateien suchen, die mit einer bestimmten Erweiterung enden)
grep -ir "string" --include="*.php" *
Wenn Sie eine Version haben
grep
, bei der die--include
Option fehlt , können Sie Folgendes verwenden. Diese wurden beide in einer Verzeichnisstruktur wie folgt getestet:Wo alle
.php
Dateien die Zeichenfolge enthaltenstring
.Verwenden
find
Erläuterung
Dadurch werden alle
.php
Dateien gefunden undgrep -H string
auf jeder ausgeführt. Mitfind
der-exec
Option{}
wird durch jede der gefundenen Dateien ersetzt. Das-H
weistgrep
an, den Dateinamen sowie die übereinstimmende Zeile zu drucken.Angenommen, Sie haben eine ausreichend neue Version von
bash
, verwenden Sieglobstar
:Erläuterung
Wie im Bash-Handbuch erklärt :
Also, indem Sie
shopt -s globstar
Ihnen die Funktion und Bash sind aktivierendeglobstar
Option , die macht**/*php
alle erweitern.php
im aktuellen Verzeichnis Dateien (**
entspricht 0 oder mehr Verzeichnisse, so**/*php
paßt./foo.php
auch) , die dann grep fürstring
.quelle
Verwenden
*/*.php
Dies macht grep search zu einer Ebene des Unterverzeichnisses
quelle