Verwenden Sie grep
die --include
Option:
grep -ir "string" --include="*.php" .
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 Suchvorgang führt.
Wenn ich das zum Beispiel mache, funktioniert es nicht:
grep -ir "string" *.php
Es funktioniert nicht, weil sich im aktuellen Verzeichnis keine PHP-Dateien befinden, aber in einigen der Unterverzeichnisse im aktuellen Verzeichnis, und die Namen der Unterverzeichnisse enden nicht mit ".php", sodass grep nicht in sie hineinschaut.
Wie kann ich also eine rekursive Suche aus dem aktuellen Verzeichnis durchführen, aber auch Dateinamen als Platzhalter angeben? (dh nur in Dateien suchen, die in einer bestimmten Erweiterung enden)
Verwenden Sie grep
die --include
Option:
grep -ir "string" --include="*.php" .
Wenn Sie über eine Version verfügen grep
, bei der die --include
Option fehlt, können Sie Folgendes verwenden. Beide wurden in einer Verzeichnisstruktur wie folgt getestet:
$ tree . ├── a ├── b │ └── foo2.php ├── c │ └── d │ └── e │ └── f │ └── g │ └── h │ └── foo.php ├── foo1.php └── foo.php
Wo alle .php
Dateien die Zeichenfolge enthalten string
.
Benutzen find
$ find . -name '*php' -exec grep -H string {} + ./b/foo2.php:string ./foo1.php:string ./c/d/e/f/g/h/foo.php:string
Dadurch werden alle .php
Dateien gefunden und anschließend grep -H string
auf jeder von ihnen ausgeführt. Mit find
der -exec
Option {}
wird durch jede der gefundenen Dateien ersetzt. Der -H
Befehl grep
zum Ausdrucken des Dateinamens sowie der übereinstimmenden Zeile.
Angenommen, Sie haben eine neue Version von genug bash
, verwenden Sie globstar
:
$ shopt -s globstar $ grep -H string **/*php b/foo2.php:string c/d/e/f/g/h/foo.php:string foo1.php:string
Wie im bash-Handbuch erklärt :
Globstar
Wenn gesetzt, stimmt das in einem Dateinamenerweiterungskontext verwendete Muster '**' mit allen Dateien und mit null oder mehr Verzeichnissen und Unterverzeichnissen überein. Wenn auf das Muster ein '/' folgt, stimmen nur Verzeichnisse und Unterverzeichnisse überein.
Also, indem Sie shopt -s globstar
Ihnen die Funktion und Bash sind aktivierende globstar
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ür string
.
Use */*.php
This makes grep search one level of subdirectory