Wie greife ich rekursiv nach einer Zeichenfolge in allen .gzDateien in allen Verzeichnissen und Unterverzeichnissen?
Wie greife ich rekursiv nach einer Zeichenfolge in allen .gzDateien in allen Verzeichnissen und Unterverzeichnissen?
Antworten:
@ Steve Weet ist fast da. Die Verwendung von / dev / null als zusätzliches Argument ist eine gute Möglichkeit, die Anzeige des Dateinamens zu erzwingen (ich werde mich daran erinnern, danke Steve), aber es wird immer noch die Ausführung für jede gefundene Datei ausgeführt - ein enormer Overhead.
Sie möchten zgrep so oft wie möglich ausführen, um jede Ausführung optimal zu nutzen:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargsliefert zgrep so viele Argumente (Dateinamen) wie möglich und führt sie wiederholt aus, bis alle vom findBefehl bereitgestellten Dateien verwendet wurden . Mit den Optionen -print0und -0kann es funktionieren, wenn in einem der Datei- oder Verzeichnisnamen Leerzeichen vorhanden sind.
Unter Mac OS X können Sie den gleichen Effekt ohne xargs erzielen:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-Hdiese Option, um den Dateinamen immer mit der übereinstimmenden Zeile anzuzeigen, zumindest in GNU grep.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Also so etwas wie
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -rdurch einen Baum zu gehen, oder wenn das -r nicht funktioniert, xargs zgrep
/bin/zgrep: -r: option not supportedauf mein neu installiertes Ubuntu-System.
xargsstattdessen stattdessen verwenden.
@aioobe ist fast da. Der Befehl erledigt die Aufgabe, teilt Ihnen jedoch nicht den Dateinamen mit
Folgendes sollte Ihnen auch den Dateinamen mitteilen:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
Durch Hinzufügen von /dev/nullwird sichergestellt, dass zgrep zwei Dateinamen sieht, sodass der Name der Datei angezeigt wird, wenn die Zeichenfolge gefunden wird
BEARBEITEN
Weitere Untersuchungen haben ergeben, dass für meinen Computer (OS / X) durch das -execzu findende Argument so viele Dateinamen wie möglich hinzugefügt werden (ähnlich wie beim xargsVerhalten).
-exec- ich bin ganz auf Portabilität bedacht, also würde ich es nicht in einem Skript verwenden, aber großartig für die Eingabeaufforderung.
find, aber für die meisten modernen (z. B. in Debian-basierten Distributionen).
-Hdiese Option, um den Dateinamen immer mit der übereinstimmenden Zeile anzuzeigen, zumindest in GNU grep anstelle des /dev/nullHacks.