Wie finde ich eine Phrase / ein Wort in Linux rekursiv in einem Dateibaum?

12441
Itay Moav -Malimovka

Wie finde ich einen rekursiven Ausdruck in einem Dateibaum in Linux?
Ich habe es versucht find . -name ./* | grep my_phrase und ich habe es versuchtgrep -r "register_long_arrays" *

5
Suchen Sie nach Dateien, deren * Name * diesen Satz / Wort enthält, oder nach Dateien, deren * Inhalt * es enthält? Nathan Fellman vor 14 Jahren 2
@ Nathan Fellman Der Inhalt enthält die Phrase Itay Moav -Malimovka vor 14 Jahren 0

5 Antworten auf die Frage

9
Ian Mackinnon
grep -r "register_long_arrays" * 

sucht rekursiv alle Vorkommen von register_long_arraysin Ihrem aktuellen Verzeichnis.

Wenn Sie möchten, kombinieren findmit grepden Arten von Dateien zu beschränken gesucht sollten Sie es wie folgt verwenden ( in diesem Beispiel wird die Suche auf Dateien beschränken Endung .txt):

find . -name '*.txt' -exec grep "register_long_arrays" {} \; 

Das {}wird durch jede Datei ersetzt, die gefunden wird find, ohne dass Sie sich Sorgen machen müssen, dass Problemzeichen wie Leerzeichen umgangen werden. Beachten Sie den umgekehrten Schrägstrich vor dem Semikolon. Dadurch wird sichergestellt, dass das Semikolon mit Escapezeichen versehen und an die exec-Klausel (grep) übergeben wird, anstatt den find-Befehl zu beenden.

Wenn Sie immer noch nicht das finden, was Sie möchten, kann dies ein Fallproblem sein (geben Sie das -iKennzeichen an, um den Fall zu ignorieren), oder der gewünschte Inhalt befindet sich in einer versteckten Datei (beginnend mit .), die *nicht übereinstimmt liefern Sie beides *und .*als Argument für grep.

Ihr `find ... -exec grep`-Befehl zeigt die Dateinamen der Dateien, die die Zeichenfolge enthalten, nicht an, da grep jedes Mal mit einem einzigen Dateinamen aufgerufen wird. Ich empfehle die Verwendung von xargs, um grep aus Effizienzgründen aufzurufen (siehe einige andere Antworten). Selbst mit xargs ist es möglich, dass grep nur mit einem einzigen Dateinamen aufgerufen wird. Verwenden Sie daher das alte sk00l-Idiom `xargs grep register_long_arrays / dev / null`, um grep zu überlisten, oder verwenden Sie` grep -H` (ein GNU-ism). coneslayer vor 14 Jahren 1
3
garyjohn
find . -type f -exec grep my_phrase {} \; 

sucht nach allen regulären Dateien, ruft jedoch grepeinmal für jede Datei auf. Dies ist ineffizient und führt dazu, dass die Suche auf langsamen Computern und / oder großen Verzeichnishierarchien merklich länger dauert. Aus diesem Grund ist es besser zu verwenden xargs:

find . -type f | xargs grep my_phrase 

oder, wenn Sie Dateien haben, deren Namen Leerzeichen enthalten,

find . -type f -print0 | xargs -0 grep my_phrase 

Noch einfacher ist es, die -rOption nur zu verwenden grep:

grep -r my_phrase . 

Beachten Sie die Verwendung von. anstelle von * als Dateinamenargument. Dadurch wird das Problem der Erweiterung von * ohne versteckte Dateien vermieden.

0
hotei
find . -exec grep my_phrase {} \; 

findErzeugt eine Liste aller Dateien im oder unterhalb des aktuellen Verzeichnisses. execführt den Befehl grep my_phrasefür jede gefundene Datei aus. Das \;ist einfach magisch, damit es funktioniert. Details zur Funktionsweise sind in der Regel mit zu sehen man find.

Möglicherweise möchten Sie auch die -HOption prüfen, grepob Sie nicht nur wissen möchten, ob sie gefunden wurde, sondern wo.

0
Nathan Fellman

Versuchen:

find . -name ./\* | xargs grep my_phrase 

xargsruft grep with für jede gefundene Datei auf find.

0
sickill

Sie können auch ack versuchen . Es ist schnell. Wenn Sie mit Codebäumen arbeiten, ist dies ein hervorragendes Werkzeug.

Rekursiv nach foobar im Dateiinhalt aus dem aktuellen Verzeichnis suchen:

ack foobar 

Suchen nach Dateien, deren Namen mit regexp übereinstimmen:

ack -g "foo(bar)?"