압축을 풀지 않고 중첩된 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어떤 이유로 프로그램에는 표준 입력에서 읽을 수 있는 옵션이 없습니다. 적응된 파이썬 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

관련 정보