Suchen nach einer Zeichenfolge in mehreren ZIP-Dateien

22

Ich arbeite an SunOS 5.10. Ich habe einen Ordner, der etwa 200 Zip-Dateien enthält. Jede Zip-Datei enthält nur eine Textdatei. Ich möchte in allen Textdateien in allen ZIP-Dateien nach einer bestimmten Zeichenfolge suchen.

Ich habe dies versucht (was nach einer Textdatei in der Zip-Datei sucht, die den String "ORA-" enthält), aber es hat nicht funktioniert.

zipgrep ORA-1680 *.zip

Was ist das Richtige daran, ohne die zip-Dateien zu dekomprimieren?

zickig
quelle
Siehe auch Wie greife ich rekursiv durch komprimierte Archive? (kein genaues Duplikat, da die Anforderungen dort komplizierter waren).
Gilles 'SO - hör auf böse zu sein'

Antworten:

26

Es ist im Allgemeinen nicht möglich, nach Inhalten in einer komprimierten Datei zu suchen, ohne sie auf die eine oder andere Weise zu dekomprimieren. Da zipgrep nur ein Shellscript ist und unzip und egrep selbst umschließt, können Sie es genauso gut manuell tun:

for file in *.zip; do unzip -c "$file" | grep "ORA-1680"; done

Wenn Sie nur die Liste der passenden ZIP-Dateien benötigen, können Sie Folgendes verwenden:

for file in *.zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

Auf diese Weise dekomprimieren Sie nur nach stdout (dh in den Speicher), anstatt die Dateien auf die Festplatte zu dekomprimieren. Sie können natürlich nur grep -adie ZIP-Dateien versuchen, aber je nach Inhalt der Datei und Ihrem Muster erhalten Sie möglicherweise falsch-positive und / oder falsch-negative Ergebnisse.

Noah
quelle
Wohin würde die erste Option die Dateien entpacken?
zickig
2
unzip -cdekomprimiert die Datei auf stdout. Die gesamte unkomprimierte Datei wird nirgendwo anders geschrieben.
Noah
+1 tks viel es spart meinen Tag. Ich füge echo "$ file" hinzu; Entpacke -c "$ file" | grep -q ORA-1680; um den Dateinamen + das Ergebnis zu kennen.
Mike
2
Meine Version von unzipverwendet -pfür das Streamen auf Pipe!
Gavenkoa
Dies funktioniert, wenn alle einzeiligen Befehle "Standardausgabe" und keinen Dateinamen +1
zurückgaben
16

zipgrepnimmt eine einzelne Datei. Damit es über mehrere Dateien hinweg funktioniert, fügen Sie es in eine Schleife ein:

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done
Dogbane
quelle
2
In einer Zeile, die bei Übereinstimmung auch den Dateinamen der Zip for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
ausgibt
4

Das AVFS- Dateisystem zeigt eine Ansicht des Dateisystems an, in dem auf jede Archivdatei /path/to/foo.zipals Verzeichnis zugegriffen werden kann~/.avfs/path/to/foo.zip# . Es ist ein FUSE- Dateisystem, das Sie unter Solaris installieren können. AVFS bietet schreibgeschützten Zugriff auf die gängigsten Archivdateiformate.

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
Gilles 'SO - hör auf böse zu sein'
quelle