![Auflisten von Dateien aus verschachtelten ZIP-Dateien ohne Extrahieren](https://rvso.com/image/76404/Auflisten%20von%20Dateien%20aus%20verschachtelten%20ZIP-Dateien%20ohne%20Extrahieren.png)
Ich habe eine Reihe verschachtelter ZIP-Dateien und muss die Dateinamen auflistenohne zu extrahierendie Archive. Zum Beispiel:
- Zip1.zip
- Text 1
- text2
- Zip2.zip
- Beispiel 1
- Beispiel 2
mit etwas Shell-Scripting sollte eine Liste wie folgt entstehen:
Zip1.zip
Zip1.zip/text1
Zip1.zip/text2
Zip1.zip/Zip2.zip/Sample1
Zip1.zip/Zip2.zip/Sample2
Antwort1
Das Flag unzip -p leitet die unkomprimierten Daten an stdout weiter. Leider unzip
hat das Programm aus irgendeinem Grund keine Option, von stdin zu lesen. Anpassung des Python-Einzeilers vonDasAntwort auf eine ähnliche Frage hilft.
z.B:
unzip -p Zip1.zip Zip1/zip2.zip| python -c 'import zipfile,sys,StringIO;print "\n".join(zipfile.ZipFile(StringIO.StringIO(sys.stdin.read())).namelist())'
Hinzugefügt: Das Java-Jar-Tool kann von stdin lesen. gestohlen vonDasAntwort.
z.B:
unzip -p Zip1.zip Zip1/zip2.zip| jar -t
Ausgabe:
zip2/
zip2/Sample2
zip2/Sample1
Original-ZIP-Datei:
$ unzip -l Zip1.zip
Archive: Zip1.zip
Length Date Time Name
--------- ---------- ----- ----
0 2015-11-03 15:49 Zip1/
5 2015-11-03 15:49 Zip1/text1
5 2015-11-03 15:49 Zip1/text2
474 2015-11-03 15:48 Zip1/zip2.zip
--------- -------
484 4 files
Den entsprechenden Serverfault-Thread habe ich gefunden vondein-Kommentar.
Dies ist kein Shell-Skript, aber es tut, was in der ursprünglichen Frage vorgeschlagen wurde:
#!/usr/bin/python
# Usage: python list-zips.py <zipfile>
import zipfile
import io
import sys
def uz(f, parent=[]):
result = []
try:
zf = zipfile.ZipFile(f)
for e in zf.namelist():
path=parent+[e]
if e.lower().endswith(".zip"):
result += uz(io.BytesIO(zf.open(e).read()), path)
else:
result.append("/".join(path))
except Exception as ex:
return result
return result
print("\n".join(uz(open(sys.argv[1], "rb"), [sys.argv[1]])))
$ python list-zips.py Zip1.zip
Zip1.zip/text1
Zip1.zip/text2
Zip1.zip/Zip2.zip/Sample1
Zip1.zip/Zip2.zip/Sample2