![列出嵌套 zip 檔案中的檔案而不解壓](https://rvso.com/image/76404/%E5%88%97%E5%87%BA%E5%B5%8C%E5%A5%97%20zip%20%E6%AA%94%E6%A1%88%E4%B8%AD%E7%9A%84%E6%AA%94%E6%A1%88%E8%80%8C%E4%B8%8D%E8%A7%A3%E5%A3%93.png)
我有一組嵌套的 zip 文件,我需要列出文件名無需提取檔案館。例如:
- Zip1.zip
- 文字1
- 文字2
- Zip2.zip
- 樣品1
- 樣品2
使用一些 shell 腳本應該會產生一個列表,例如
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
這不是 shell 腳本,但它執行了原始問題中建議的操作:
#!/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