![압축을 풀지 않고 중첩된 zip 파일의 파일 나열](https://rvso.com/image/76404/%EC%95%95%EC%B6%95%EC%9D%84%20%ED%92%80%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%EC%A4%91%EC%B2%A9%EB%90%9C%20zip%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%EB%82%98%EC%97%B4.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에서 읽을 수 있는 옵션이 없습니다. Python one liner 적용이것비슷한 질문에 대한 대답이 도움이 됩니다.
예:
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