Mit find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( Dient -type f
nur zum Suchen in regulären Dateien (auch ohne Symlinks, selbst wenn sie auf reguläre Dateien verweisen). Wenn Sie in einem beliebigen Dateityp außer Verzeichnissen suchen möchten (aber beachten Sie, dass es einige Dateitypen wie fifos oder / dev / zero gibt) im allgemeinen mögen Sie nicht lesen), ersetzen Sie -type f
mit dem GNU-spezifischen ! -xtype d
( -xtype d
Einstimmungen für Dateien vom Typ Verzeichnis nach Symlink Auflösung)).
Mit GNU grep
:
grep -r pattern /the/dir
(Beachten Sie jedoch, dass, sofern Sie keine neuere Version von GNU grep haben, beim Abstieg in Verzeichnisse Symlinks folgen). Nicht reguläre Dateien werden nur durchsucht, wenn Sie eine -D read
Option hinzufügen . Neuere Versionen von GNU grep
werden jedoch immer noch nicht in Symlinks suchen.
Sehr alte Versionen von GNU find
haben die Standardsyntax nicht unterstützt {} +
, aber dort können Sie die nicht standardmäßige verwenden:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Performances sind wahrscheinlich I / O-gebunden. Dies ist die Zeit, die für die Suche benötigt wird, um alle diese Daten aus dem Speicher zu lesen.
Wenn sich die Daten auf einem redundanten Festplattenarray befinden, kann das gleichzeitige Lesen mehrerer Dateien die Leistung verbessern (und sie ansonsten beeinträchtigen). Wenn die Leistung nicht an E / A gebunden ist (weil sich beispielsweise alle Daten im Cache befinden) und Sie über mehrere CPUs verfügen, kann die gleichzeitige greps
Ausführung ebenfalls hilfreich sein. Sie können dies mit xargs
der -P
Option von GNU tun .
Zum Beispiel, wenn sich die Daten auf einem RAID1-Array mit 3 Laufwerken befinden oder wenn sich die Daten im Cache befinden und Sie 3 CPUs haben, deren Zeit übrig bleibt:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(Hier wird alle 1000 Dateien -n1000
eine neue grep
Datei erzeugt, bis zu 3 gleichzeitig).
Beachten Sie jedoch, dass Sie, wenn die Ausgabe von grep
umgeleitet wird, eine schlecht verschachtelte Ausgabe der drei grep
Prozesse erhalten. In diesem Fall möchten Sie sie möglicherweise ausführen als:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(auf einem aktuellen GNU- oder FreeBSD-System) oder verwenden Sie die --line-buffered
Option von GNU grep
.
Wenn pattern
es sich um eine feste Zeichenfolge handelt, kann das Hinzufügen der -F
Option die Situation verbessern.
Wenn es sich nicht um Mehrbytezeichendaten handelt oder wenn für die Übereinstimmung dieses Musters keine Rolle spielt, ob es sich um Mehrbytezeichen handelt oder nicht, dann gilt Folgendes:
cd /the/dir &&
LC_ALL=C grep -r pattern .
könnte die Leistung erheblich verbessern.
Wenn Sie solche Suchanfragen häufig durchführen, möchten Sie Ihre Daten möglicherweise mithilfe einer der vielen Suchmaschinen indizieren.
find
mitxargs
odergrep -R