解凍せずに入れ子になったzipファイルのファイルを一覧表示する

解凍せずに入れ子になったzipファイルのファイルを一覧表示する

ネストされた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 フラグは、圧縮されていないデータを標準出力にパイプします。残念ながら、unzip何らかの理由でプログラムには標準入力から読み取るオプションはありません。適応Python onelinerこれ同様の質問に答えるだけです。

たとえば、

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

元の圧縮ファイル:

$ 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

関連情報