Wenn ich in Windows eine Zeichenfolge für alle Dateien in allen Unterverzeichnissen finden wollte, würde ich so etwas tun
findstr /C:"the string" /S *.h
Unter Linux (z. B. Ubuntu) habe ich jedoch keinen anderen Weg gefunden als einen Pipeline-Befehl mit find
, xargs
und grep
(ein Beispiel finden Sie auf dieser Seite: Wie kann ich rekursiv durch Unterverzeichnisse blättern? ). Meine Frage ist jedoch anders: Gibt es einen einzelnen integrierten Befehl , der diese Magie verarbeitet, ohne mein Shell-Skript schreiben zu müssen?
*
in Folgendes zu ändern'*'
: "Das Zitieren des letzten Platzhalters ist erforderlich, um Fehler zu vermeiden, wenn ein Dateiname mit - beginnt"-Msomething
oder an einerGREP_OPTIONS
Einstellung.grep -r searchpattern /path/to/start/in
Wo
/path/to/start/in/
kann nur ".
" für das aktuelle Verzeichnis sein.quelle
Nein
find -name \*.h -print0 | xargs -0 grep -l 'the regex'
ist so magisch wie es nur geht.quelle
-r
Option integriert. Keine Notwendigkeit für die schwere Artillerie.xargs
fügt nur Lärm hinzu. Verwendungfind -name \*.h -execdir grep -l 'the regex {} +
Um pedantisch zu sein, nein, Sie können nicht davon ausgehen, dass ein solcher Befehl existiert .
Es gibt viele verschiedene Implementierungen von Unix, und jede hat ihre eigenen Macken. POSIX, der gemeinsame Nenner (und einem Standard in allen Einheiten am nächsten), gibt eine solche Option für nicht an
grep
.Wie in anderen Antworten erwähnt, verfügt die Implementierung von GNU
grep
über eine nicht standardmäßige Option, die das tut, was Sie wollen. Während diese spezielle Implementierung auf Linux-Systemen häufig vorkommt, können Sie nicht davon ausgehen, dass sie unter Unix verfügbar ist, auch nicht auf einigen Linux-Systemen.Abschließend sollte ich erwähnen, dass es die Unix-Philosophie ist , die Kombination mehrerer primitiver Programme gegenüber der Verwendung einer großen monolithischen ausführbaren Datei zu bevorzugen, die versucht, alles auf einmal zu tun.
In Ihrem Fall sind das Crawlen des Dateisystems und das Abgleichen des regulären Ausdrucks in einem Stream zwei separate Aufgaben. Es ist nur normal, jedes in einem separaten Programm zu behandeln.
quelle
Verwenden Sie den folgenden Befehl, um eine Zeichenfolge aus einem bestimmten Verzeichnis zu finden
Beispielsweise:
quelle
grep
kann mehr als eine Datei als Argumente verwenden, daher sollten Sie+
stattdessen verwenden\;
, um zu vermeiden, dass eingrep
Aufruf pro Datei ausgeführt wird, was ziemlich ineffizient ist.-name '*'
auf Dateien beschränkt ist, deren Name im aktuellen Gebietsschema gültiger Text ist (find
zumindest in einigen Implementierungen), die anderen Verzeichniskomponenten jedoch möglicherweise weiterhin Folgen von Bytes enthalten, die keine gültigen Zeichen bilden. Wenn Sie-name '*'
damit sicherstellen möchten, dass die Ausgabe gültiger Text ist (indem Sie die Dateien mit falschen Namen weglassen),find ... ! -name '*' -prune -o -exec grep ... {} +
möchten Sie lieber verwenden , was auch verhindern würde , dass Siefind
in Verzeichnisse mit falschen Namen absteigen.