Mit grep rekursiv
grep hat die Fähigkeit, um die Suche rekursiv über die -r
option. Aber ich Frage mich, ob grep hat die Fähigkeit zur Suche nach einem query-string rekursiv für eine bestimmte Anzahl an Unterordner-Ebenen. Zum Beispiel habe ich einen Ordner root
die Ordner parent1, parent2, ..., parentN
. Jedem übergeordneten Ordner hat normale text-Dateien und Ordnern, genannt child1, child2, ..., childM
. Ich möchte zum ausführen von grep von der root-Ebene und die Suche in den Dateien innerhalb der Eltern, ohne die Suche in den untergeordneten Ordnern. Gibt es eine einfache Möglichkeit, dies zu tun?
- Sie wollen etwas tun wie: find /path/to/find-name "nameofthefile" wollen oder Katze jede Datei zu überprüfen, ob ein string?
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie versuchen, diese:
grep:
oder verwenden Sie diese
find | xargs grep
mit finden, können Sie definieren die Ebene
BEARBEITEN
Rohr Ausgabe von einem Befehl zum anderen ist sehr Häufig in linux - /unix-Welt. Ich Wette, Sie tun es jeden Tag.
Beachten Sie, dass nicht alle Beispiele oben sind effizient. Sie sind nur Beispiele.
Als Kent Hinweise, Sie können es nicht mit einer geraden
grep
; es ist einfach nicht leistungsfähig genug. Der trick ist die Verwendungfind
arbeiten Sie heraus, welche Dateien durchsucht werden sollen, und übergeben Sie die Datei-Liste, diefind
produziertgrep
.Wenn Sie
man find
erhalten Sie die man-Seite der viele Optionen, diefind
nimmt. Die, die wir sind daran interessiert, hier ist-maxdepth
.Let ' s build bis der Befehl, den wir brauchen. Führen Sie die Befehle auf jeder Stufe, um zu sehen, was es aussieht:
find .
wird eine Liste aller Dateien und Ordner, die sich im aktuellen Ordner (.
) oder jeder Nachkomme Ordner.find . -maxdepth 1
wird eine Liste aller Dateien und Ordner im aktuellen Ordner.find . -maxdepth 2
wird ebenfalls eine Liste aller Dateien und Ordner im aktuellen Ordner und jedem unmittelbaren Unterordner. Und so weiter...Beachten Sie, dass wir immer Ordner aufgeführt zu; das wollen wir nicht, wie
grep
können nicht suchen Sie einen Ordner selbst, sondern nur die Dateien in dem Ordner. Hinzufügen-type f
nur Dateien aufgeführt:find . -maxdepth 2 -type f
.Wissen wir nun die Dateien, die wir suchen wollen, wir brauchen, um
grep
zu suchen, diese Dateien. Der standard-Weg, dies zu tun ist mitxargs
:Den
|
nimmt "standard-Ausgabe", aka "stdout", vonfind
(also das, was man normalerweise auf dem Bildschirm sehen) und übergibt es inxarg
's "standard-Eingabe", aka "stdin", dh, was normalerweise geschehen würde, wenn Sie die Eingabe in ein Programm läuft.xargs
ist ein schlaues kleines Programm, das ausgeführt wird, was auch immer Sie sagen, es (hiergrep <text-to-search-for>
), nach addition aller Argumente, die es empfangen, die auf stdin. Das Ergebnis ist, dassgrep
Suche wird jeder Datei, diefind
findet.Das funktioniert nicht, wenn einige Ihrer Datei-Namen mit Leerzeichen in Ihnen, obwohl, weil
xargs
denkt, der Raum ist zwischen zwei verschiedenen Datei-Namen, eher als ein Teil einer Datei name. Es gibt eine Reihe von Möglichkeiten, dies zu behandeln (die ideale ist, um sich nur keine Leerzeichen im Dateinamen), und die häufigste ist die Verwendung eines der ausgefalleneren features vonfind
.Wenn Sie hinzufügen, ein
-exec
argumentfind
ist, wird ausgeführt, alles, was Sie angeben, bis zu einer;
oder+
. Wenn Sie fügen Sie eine{}
(das ist die wörtliche Zeichen{
und}
), es ersetzt diese mit einer Liste aller Dateien. Dafind
tut, es weiß, dass Leerzeichen in den Dateinamen sind eigentlich in den Dateinamen.Daher der beste Weg, das zu tun, was Sie versuchen, ist so:
(Der Unterschied zwischen der Endung
+
und;
macht hier keine Unterschiede. Wenn Sie interessiert sind es inman find
, aber die kurze version ist, dass+
ist schneller, aber bedeutet Sie können nur eine{}
im Befehl.)