Sie könnten auch Globstar verwenden.
Das Erstellen von grep
Befehlen mit find
, wie in Zannas Antwort , ist eine äußerst robuste, vielseitige und tragbare Möglichkeit, dies zu tun (siehe auch die Antwort von sudodus ). Und muru hat einen ausgezeichneten Ansatz für die Verwendung grep
der --include
Option veröffentlicht . Wenn Sie jedoch nur den grep
Befehl und Ihre Shell verwenden möchten , gibt es eine andere Möglichkeit: Sie können die Shell selbst dazu bringen , die erforderliche Rekursion durchzuführen :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
Das -H
Flag grep
zeigt den Dateinamen an, auch wenn nur eine passende Datei gefunden wird. Sie können den Pass -a
, -i
und -n
Fahnen (von Ihrem Beispiel) grep
als auch, wenn es das ist , was Sie brauchen. Aber nicht bestanden -r
oder -R
bei dieser Methode. Es ist die Shell , die Verzeichnisse beim Erweitern des Glob-Musters rekursiv verwendet **
und nichtgrep
.
Diese Anweisungen gelten speziell für die Bash-Shell. Bash ist die Standardbenutzershell unter Ubuntu (und den meisten anderen GNU / Linux-Betriebssystemen). Wenn Sie also unter Ubuntu arbeiten und Ihre Shell nicht kennen, ist dies mit ziemlicher Sicherheit Bash. Beliebte Shells unterstützen zwar normalerweise Verzeichnis- **
übergreifende Globs, funktionieren jedoch nicht immer auf die gleiche Weise. Weitere Informationen finden Sie Stéphane Chazelas ‚s ausgezeichnete Antwort auf Das Ergebnis der ls *, ls ** und ls *** auf Unix.SE .
Wie es funktioniert
Einschalten der globstar bash Shell Option macht **
Spiel Pfade Verzeichnistrenner enthält ( /
). Es ist also ein verzeichnisrekursiver Glob. Im Einzelnen, wie man bash
erklärt:
Wenn die Globstar- Shell-Option aktiviert ist und * in einem Pfadnamen-Erweiterungskontext verwendet wird, stimmen zwei benachbarte * s, die als ein einziges Muster verwendet werden, mit allen Dateien und null oder mehr Verzeichnissen und Unterverzeichnissen überein. Wenn gefolgt von einem /, stimmen zwei benachbarte * nur mit Verzeichnissen und Unterverzeichnissen überein.
Sie sollten vorsichtig sein, da Sie Befehle ausführen können, mit denen weit mehr Dateien geändert oder gelöscht werden, als Sie beabsichtigen, insbesondere, wenn Sie schreiben, **
wann Sie schreiben möchten *
. (Es ist sicher in diesem Befehl, der keine iles ändert.) shopt -u globstar
Schaltet die Globstar-Shell-Option wieder aus.
Es gibt einige praktische Unterschiede zwischen globstar und find
.
find
ist viel vielseitiger als globstar. Alles, was Sie mit globstar tun können, können Sie auch mit dem find
Befehl tun . Ich mag Globstar und manchmal ist es praktischer, aber Globstar ist keine generelle Alternative zu find
.
Die obige Methode sucht nicht in Verzeichnissen, deren Namen mit a beginnen .
. Manchmal möchten Sie solche Ordner nicht wiederverwenden, manchmal jedoch.
Wie bei einem normalen Glob erstellt die Shell eine Liste aller übereinstimmenden Pfade und übergibt sie grep
anstelle des Glob als Argumente an Ihr Kommando ( ). Wenn Sie so viele Dateien aufgerufen haben, file.txt
dass der resultierende Befehl für die Ausführung durch das System zu lang wäre, schlägt die oben beschriebene Methode fehl. In der Praxis würden Sie (mindestens) Tausende solcher Dateien benötigen, aber es könnte passieren.
Die verwendeten Methoden find
unterliegen nicht dieser Einschränkung, da:
Zannas Methode erstellt und führt einen grep
Befehl mit möglicherweise vielen Pfadargumenten aus. Wenn jedoch mehr Dateien gefunden werden, als in einem einzelnen Pfad aufgeführt werden können, führt die Aktion +
-terminated -exec
den Befehl mit einigen Pfaden aus und führt ihn dann erneut mit einigen weiteren Pfaden aus. Im Falle grep
einer Zeichenfolge in mehreren Dateien führt dies zum korrekten Verhalten.
Wie bei der hier beschriebenen Globstar-Methode werden alle übereinstimmenden Zeilen mit vorangestellten Pfaden gedruckt.
der weg von sudodus verläuft grep
für jedes file.txt
gefundene separat . Wenn es viele Dateien gibt, ist es möglicherweise langsamer als einige andere Methoden, aber es funktioniert.
Bei dieser Methode werden Dateien gesucht und ihre Pfade gedruckt, gefolgt von etwaigen übereinstimmenden Zeilen. Dies ist ein anderes Ausgabeformat als das von meiner Methode, Zanna und Murus , erzeugte .
Farbe bekommen mit find
Einer der unmittelbaren Vorteile von Globstar ist, dass Ubuntu standardmäßig grep
kolorierte Ausgaben erzeugt. Aber man kann dies leicht zu bekommen find
, auch .
Benutzerkonten in Ubuntu werden mit einem Alias erstellt , der grep
wirklich zum Laufen bringt grep --color=auto
(run alias grep
to see). Es ist eine gute Sache, dass Aliase so gut wie nur dann erweitert werden, wenn Sie sie interaktiv ausgeben. Wenn Sie find
jedoch grep
mit dem --color
Flag aufrufen möchten , müssen Sie es explizit schreiben. Beispielsweise:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +