GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So führen Sie eine Grep-Suche für alle Dateien und in allen Verzeichnissen durch

Grep ist ein ausgezeichnetes Werkzeug, wenn Sie den Inhalt einer Datei durchsuchen müssen.

Normalerweise führen Sie grep auf einer einzelnen Datei wie dieser aus:

grep search_term filename

Grep ist ziemlich vielseitig. Wenn Sie alle Dateien in einem Verzeichnis mit grep durchsuchen möchten , verwenden Sie es wie folgt:

grep search_term *

Es gibt ein Problem damit. Es sucht nur in allen Dateien im aktuellen Verzeichnis. Es wird nicht in den Unterverzeichnissen gesucht.

Sie können eine grep-Suche in allen Dateien und allen Unterverzeichnissen durchführen des aktuellen Verzeichnisses mit -r rekursive Suchoption:

grep -r search_term . 

Sie können auch den Verzeichnispfad angeben, wenn Sie sich nicht in dem Verzeichnis befinden, in dem Sie die Suche durchführen möchten:

grep -r search_term directory_path

Das war eine kurze Zusammenfassung. Lassen Sie mich Ihnen all dies im Detail mit geeigneten Beispielen zeigen, damit es für Sie leichter zu verstehen ist.

Grep sucht in allen Dateien eines Verzeichnisses

Hier ist die Verzeichnisstruktur, die ich in diesem Beispiel verwenden werde. Außer empty.txt enthalten alle Dateien den Begriff 'simple', für den ich die grep-Suche durchführen werde.

[email protected]:~/scripts$ tree
.
├── dir1
│   └── new_script.sh
├── dir2
│   └── your_script.sh
├── dir3
│   ├── empty.txt
│   └── linked.txt -> ../../sample.txt
├── my_script.sh
└── your_script.sh

3 directories, 6 files

Um in allen Dateien der aktuellen Verzeichnisse nach dem Wort 'einfach' zu suchen, verwenden Sie einfach den Platzhalter (*). Der Platzhalter wird tatsächlich durch den Namen aller Dateien und Verzeichnisse im aktuellen Verzeichnis ersetzt.

grep simple *

Dadurch werden alle Dateien in den aktuellen Verzeichnissen durchsucht, aber die Unterverzeichnisse werden nicht betreten. Da Sie nicht direkt in einem Verzeichnis suchen können, wird der Fehler „XYZ ist ein Verzeichnis“ zusammen mit den Suchergebnissen angezeigt.

Wenn Sie sich nicht im selben Verzeichnis befinden, in dem Sie auftreten möchten, können Sie den Verzeichnispfad angeben und mit /*

beenden
grep search_term directory_path/*

Grundsätzlich verwenden Sie den Platzhalter, um alle Elemente (Dateien und Verzeichnisse) des angegebenen Verzeichnisses zu erweitern.

Nun, da Sie das wissen, schauen wir uns an, wie Sie mit grep eine rekursive Suche durchführen können, sodass es auch in die Dateien in den Unterverzeichnissen schaut.

Grep rekursive Suche in allen Unterverzeichnissen eines Verzeichnisses

Grep stellt ein -r bereit Option für die rekursive Suche. Mit dieser Option wird grep in alle Dateien im aktuellen (oder angegebenen) Verzeichnis schauen und es wird auch in alle Dateien aller Unterverzeichnisse schauen.

Hier ist die rekursive Suche, die ich im vorherigen Beispiel durchgeführt habe, um eine grep-Suche im aktuellen Ordner durchzuführen:

grep -r simple .

Hier ist das Ergebnis:

Es gibt auch ein -R Option für die rekursive Suche und funktioniert fast genauso wie -r Option.

grep -R simple .

Also, was ist der Unterschied grep -r und grep -R ? Eigentlich nur eine. Das -R ist eine dereferenzierte Suche, was bedeutet, dass sie den symbolischen Links folgt, um zur Originaldatei zu gelangen (die sich möglicherweise in einem anderen Teil des Systems befindet).

Sehen Sie sich die Ausgabe von -R an Suche im gleichen Beispiel:

Ist Ihnen aufgefallen, dass es mit der linked.txt ein zusätzliches Suchergebnis liefert das ist im Grunde ein symbolischer Link und wurde bei der grep-Suche mit -r weggelassen Option?

Wenn Sie sich nicht in dem Verzeichnis befinden, in dem Sie die rekursive Suche durchführen möchten, geben Sie einfach den absoluten oder relativen Pfad des Verzeichnisses an den grep-Befehl an:

grep -r search_term path_to_directory

Bonus-Tipp:Bestimmtes Verzeichnis von der rekursiven grep-Suche ausschließen

Alles scheint gut, aber was ist, wenn Sie ein bestimmtes Verzeichnis von der rekursiven Suche ausschließen möchten? Auch dafür gibt es eine Vorschrift. Ich habe Ihnen gesagt, grep ist ein äußerst vielseitiger Befehl.

grep -r --exclude-dir=dir_name serach_term directory_path

Das ist es nicht. Sie können mehr als ein Unterverzeichnis folgendermaßen von der rekursiven Suche ausschließen:

grep -r --exclude-dir={dir1,dir2} serach_term directory_path

So sieht das Ausschließen von Verzeichnissen in unserem Beispiel hier aus:

Und ja, wie das obige Beispiel zeigt, funktioniert der Ausschluss sowohl mit -r und -R rekursive Optionen.

Zusammenfassend

Hier ist eine kurze Zusammenfassung der Verwendung der grep-Suche für mehrere Dateien und Verzeichnisse:

Grep-Befehl Beschreibung
Grep-String * Sucht in allen Dateien im aktuellen Verzeichnis
grep string dir Sucht in allen Dateien im dir-Verzeichnis
grep -r Zeichenfolge . Rekursive Suche in allen Dateien in allen Unterverzeichnissen
grep -r string dir Rekursive Suche in allen Dateien in allen Unterverzeichnissen von dir
grep -R Zeichenfolge . Dasselbe wie r, folgt aber den symbolischen Links

Ich hoffe, Ihnen gefällt dieser schnelle grep-Tipp. Wenn Sie mehr wollen, können Sie dieses ausführliche Tutorial zur Verwendung des grep-Befehls lesen:

Lassen Sie mich wissen, wenn Sie Fragen oder Vorschläge zu diesem Thema haben.


Linux
  1. So suchen und entfernen Sie Verzeichnisse rekursiv unter Linux

  2. Befehlszeile:Suchen und Ersetzen in allen Dateinamen, die mit grep übereinstimmen

  3. Wie man alle Dateien und Verzeichnisse rekursiv auflistet

  4. Wie durchsuche ich Verzeichnisse und finde Dateien, die mit Regex übereinstimmen?

  5. Wie finde ich alle Dateien und Verzeichnisse, die von einem bestimmten Benutzer beschreibbar sind?

So kopieren Sie Dateien und Verzeichnisse unter Linux

So verschieben Sie Dateien und Verzeichnisse in Linux (mv-Befehl)

So führen Sie eine Mustersuche in Dateien mit Grep durch

So verwenden Sie den cp-Befehl zum Kopieren von Dateien und Verzeichnissen

So synchronisieren Sie Dateien und Verzeichnisse mit Zaloha.sh

So sichern Sie Dateien und Verzeichnisse mit Rsync unter Linux