Kontext
Ich habe ein Verzeichnis mit Tausenden von Zip-Dateien, die im Formular datiert sind YYYYMMDD_hhmmss.zip
und jeweils etwa 300 KB groß sind. In jeder Zip-Datei befinden sich ca. 400 XML-Dateien mit jeweils ca. 3 KB.
Das Problem
Ich muss in der Lage sein, eine bestimmte Zeichenfolge innerhalb eines Datumsbereichs der Zip-Dateien zu suchen und zu finden.
Die aktuelle (wenn auch mittelmäßige) Lösung
Ich habe den folgenden Einzeiler
find /home/mydir/ -type f | sort | \
awk "/xml_20140207_000016.zip/,/xml_20140207_235938.zip/" | \
xargs -n 1 -P 10 zipgrep "my search string"
Der Punkt ist zu
- Listen Sie alle Dateien in meinem Verzeichnis mit tausend Dateien auf
- Sortieren Sie diese Liste von Dateien
- Abrufen einer Reihe von Dateien basierend auf bestimmten Daten (dieser
awk
Befehl druckt nur Zeilen nach dieser ersten übereinstimmenden Zeichenfolge und bis zu dieser zweiten übereinstimmenden Zeichenfolge). - Übergeben Sie jede Zeile des Ergebnisses, die einer einzelnen Datei entspricht, an
zipgrep
Die Frage
Dieser Einzeiler läuft schrecklich langsam, selbst mit 10 Prozessen auf einer 24-Kern-Maschine. Ich glaube, es ist langsam wegen des zipgrep
Befehls, aber ich bin nicht klug genug zu wissen, wie man es verbessert. Ich weiß nicht, ob ich es sein sollte, aber es ist mir ein wenig peinlich, dass ein Kollege ein Java-Tool geschrieben hat, das schneller läuft als dieses Skript. Ich würde das gerne umkehren, wenn es möglich ist. Weiß dann jemand, wie man diesen Befehl in diesem Zusammenhang schneller macht? Oder um irgendeinen Teil davon überhaupt zu verbessern?
unzip -p
oder unzip -c
eine kleine Verbesserung bewirken .
unzip -c
ob die Zip-Datei überhaupt für Ihre Ergebnisse relevant ist, und erst dann die einzelnen darin enthaltenen Dateien genauer untersuchen.