Wie greife ich rekursiv nach einer Zeichenfolge in allen .gz
Dateien in allen Verzeichnissen und Unterverzeichnissen?
Wie greife ich rekursiv nach einer Zeichenfolge in allen .gz
Dateien 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
xargs
liefert zgrep so viele Argumente (Dateinamen) wie möglich und führt sie wiederholt aus, bis alle vom find
Befehl bereitgestellten Dateien verwendet wurden . Mit den Optionen -print0
und -0
kann 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 {} +
-H
diese 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 -r
durch einen Baum zu gehen, oder wenn das -r nicht funktioniert, xargs zgrep
/bin/zgrep: -r: option not supported
auf mein neu installiertes Ubuntu-System.
xargs
stattdessen 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/null
wird 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 -exec
zu findende Argument so viele Dateinamen wie möglich hinzugefügt werden (ähnlich wie beim xargs
Verhalten).
-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).
-H
diese Option, um den Dateinamen immer mit der übereinstimmenden Zeile anzuzeigen, zumindest in GNU grep anstelle des /dev/null
Hacks.