Ich muss die ersten 50 Zeilen jeder Datei in einem Verzeichnis und seinen Unterverzeichnissen durchsuchen.
Dies erledigt den rekursiven Teil, aber wie beschränke ich mich auf die ersten 50 Zeilen jeder Datei?
grep -r "matching string here" .
Einige dieser Dateien sind riesig und ich möchte nur, dass sie in den ersten 50 Zeilen übereinstimmen. Ich versuche, den Prozess zu beschleunigen, indem ich in einigen Dateien keine Megabyte an Binärdaten durchsuche.
Antworten:
Wenn Sie nur die passenden Dateien möchten:
oder
Wenn Sie nur die passenden Zeichenfolgen möchten:
oder besser,
Und wenn Sie beides wollen:
Bemerkungen.
sed
der Combohead
-grep
.-exec ... +
in jeder Methode verwenden, aber dann müssen Sie Ihre innere Schleife selbst codieren! (triviale Übung dem Leser überlassen). Dies ist möglicherweise etwas effizienter, wenn Sie über eine Unmenge von Dateien verfügen.quelle
Wenn Sie die grep-Ausgabe wie im Original benötigen, können Sie Folgendes tun:
Wenn Sie nur die Dateinamen benötigen, können Sie den 2. grep durch ersetzen
echo "$f"
.quelle
Sie müssen einige verschiedene Dienstprogramme kombinieren, um die gewünschte Funktionalität zu erhalten. Verwenden Sie den
find
Befehl, um die Verzeichnisse zu rekursieren, alle Dateien zu suchen und denhead
Befehl für jede gefundene Datei auszuführen . Mit demhead
Befehl können nur die ersten 50 Zeilen jeder Datei ausgegeben werden. Zuletzt leiten Sie die Ausgabe an grep weiter, um nach der gewünschten Zeichenfolge zu suchen.find . -type f -exec head -n 50 {} ";" | grep "matching string here"
quelle