![ネストされた zip ファイルからファイルを抽出せずに一覧表示する](https://rvso.com/image/76404/%E3%83%8D%E3%82%B9%E3%83%88%E3%81%95%E3%82%8C%E3%81%9F%20zip%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%9B%E3%81%9A%E3%81%AB%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B.png)
ネストされたzipファイルのセットがあり、ファイル名をリストする必要があります抽出せずにアーカイブ。例:
- ZIP1.zip
- テキスト 1
- テキスト2
- ZIP2.zip ファイル
- サンプル1
- サンプル2
シェルスクリプトを使用すると、次のようなリストが表示されます。
Zip1.zip
Zip1.zip/text1
Zip1.zip/text2
Zip1.zip/Zip2.zip/Sample1
Zip1.zip/Zip2.zip/Sample2
答え1
unzip -pフラグは、圧縮されていないデータをstdoutにパイプします。残念ながら、unzip
何らかの理由でプログラムにはstdinから読み込むオプションがありません。これ同様の質問への回答は役に立ちます。
例えば:
unzip -p Zip1.zip Zip1/zip2.zip| python -c 'import zipfile,sys,StringIO;print "\n".join(zipfile.ZipFile(StringIO.StringIO(sys.stdin.read())).namelist())'
追加: Java jarツールはstdinから読み取ることができます。これ答え。
例えば:
unzip -p Zip1.zip Zip1/zip2.zip| jar -t
出力:
zip2/
zip2/Sample2
zip2/Sample1
元のzipファイル:
$ 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
関連するServerfaultスレッドを見つけましたあなたの-コメント。
これはシェル スクリプトではありませんが、元の質問で提案されたことを実行します。
#!/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