Frage Wie grep rekursiv?


Wie rekrutiere ich? grep alle Verzeichnisse und Unterverzeichnisse?

find . | xargs grep "texthere" *

1347
2018-01-01 05:10


Ursprung


Antworten:


grep -r "texthere" .

Der erste Parameter stellt den regulären Ausdruck dar, nach dem gesucht werden soll, während der zweite Parameter das Verzeichnis darstellt, nach dem gesucht werden soll. In diesem Fall, . bedeutet das aktuelle Verzeichnis.

Hinweis: Dies funktioniert für GNU grep, und auf einigen Plattformen wie Solaris müssen Sie GNU grep im Gegensatz zur herkömmlichen Implementierung verwenden. Für Solaris ist dies die ggrep Befehl.


2030
2018-01-01 05:11



Wenn Sie die Erweiterung oder das Muster der Datei kennen, die Sie möchten, ist eine andere Methode zu verwenden --include Möglichkeit:

grep -r --include "*.txt" texthere .

Sie können auch Dateien angeben, die ausgeschlossen werden sollen --exclude.

Ag

Wenn Sie häufig Code durchsuchen, Ag (Der Silberne Sucher) ist eine viel schnellere Alternative zu Grep, die für die Suche nach Code angepasst ist. Zum Beispiel ist es rekursiv und ignoriert automatisch Dateien und Verzeichnisse, die in aufgelistet sind .gitignore, so müssen Sie nicht die gleichen umständlichen Ausschlussoptionen zu grep oder zu finden.


568
2017-12-30 22:59



Ebenfalls:

find ./ -type f -print0 | xargs -0 grep "foo"

aber grep -r ist eine bessere Antwort.


106
2018-01-01 05:14



Nutze ich jetzt immer (auch unter Windows mit GoW - Gnu unter Windows):

grep --include="*.xxx" -nRHI "my Text to grep" *

Dazu gehören die folgenden Optionen:

--include=PATTERN

Rekursieren Sie in Verzeichnissen, die nur nach Datei-Übereinstimmungen suchen PATTERN.

-n, --line-number

Setzen Sie jede Ausgabezeile mit der Zeilennummer in der Eingabedatei vor.

-R, -r, --recursive

Lese alle Dateien unter jedem Verzeichnis rekursiv; das ist gleichbedeutend mit dem -d recurse Möglichkeit.

-H, --with-filename

Drucken Sie den Dateinamen für jedes Spiel.

-I     

Verarbeitet eine Binärdatei so, als ob sie keine übereinstimmenden Daten enthalten würde;
  das ist gleichbedeutend mit dem --binary-files=without-match Möglichkeit.

Und ich kann hinzufügen 'i"(-nRHIi), wenn ich die Groß- und Kleinschreibung nicht berücksichtigen möchte.

Ich kann erhalten:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

83
2018-02-14 09:33



Oder installieren Sie ack, wenn Sie einen viel schnelleren Weg wollen und dies viel tun.


53
2018-01-01 05:47



In POSIX-Systemen finden Sie nicht -r Parameter für grep und dein grep -rn "stuff" . wird nicht ausgeführt, aber wenn Sie verwenden find befehle es:

find . -type f -exec grep -n "stuff" {} \; -print

Zugestimmt Von Solaris und HP-UX.


19
2017-08-08 14:56



Um den Namen zu finden files mit path rekursiv das bestimmte enthalten string Verwenden Sie den folgenden Befehl zum UNIX:

find . | xargs grep "searched-string"

zum Linux:

grep -r "searched-string" .

finde eine Datei auf UNIX Server

find . -type f -name file_name

finde eine Datei auf dem LINUX Server

find . -name file_name

10
2018-01-29 14:31



Ag ist meine Lieblingsmethode, dies jetzt zu tun github.com/ggreer/the_silver_searcher . Es ist im Grunde das Gleiche wie ack, aber mit ein paar mehr Optimierungen.

Hier ist ein kurzer Benchmark. Ich lösche den Cache vor jedem Test (vgl https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s

8
2018-05-21 23:37



Wenn Sie nur tatsächlichen Verzeichnissen und nicht symbolischen Links folgen möchten,

grep -r "thingToBeFound" directory

Wenn Sie sowohl symbolischen als auch tatsächlichen Verzeichnissen folgen wollen (achten Sie auf unendliche Rekursion),

grep -R "thing to be found" directory

Da Sie rekursiv rekursiv arbeiten möchten, sind die folgenden Optionen möglicherweise hilfreich für Sie:

-H: outputs the filename with the line

-n: outputs the line number in the file

Wenn Sie also alle Dateien suchen möchten, die Darth Vader im aktuellen Verzeichnis oder in Unterverzeichnissen enthalten, und den Dateinamen und die Zeilennummer erfassen, aber nicht wollen, dass die Rekursion symbolischen Links folgt, wäre der Befehl

grep -rnH "Darth Vader" .

Wenn Sie alle Erwähnungen des Wortes Katze im Verzeichnis finden wollen

/home/adam/Desktop/TomAndJerry 

und du bist gerade im Verzeichnis

/home/adam/Desktop/WorldDominationPlot

Wenn Sie den Dateinamen, aber nicht die Zeilennummer einer Instanz der Zeichenfolge "cats" erfassen möchten und die Rekursion den symbolischen Links folgen soll, wenn sie gefunden wird, können Sie eine der folgenden Aktionen ausführen

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

Quelle:

läuft "grep --help"

Eine kurze Einführung in symbolische Links, für jeden, der diese Antwort liest und verwirrt durch meinen Hinweis darauf: https://www.nixtutor.com/freebsd/understanding-symbolic-links/


8
2017-08-03 20:08