列出嵌套 zip 文件中的文件而不提取

Sat*_*h R 6 zip shell-script

我有一组嵌套的 zip 文件,我需要列出文件名而不提取档案。例如:

  • 压缩包1.zip
    • 文本1
    • 文本 2
    • 压缩包.zip
      • 样品 1
      • 样品 2

使用一些 shell 脚本应该会产生一个列表,例如

Zip1.zip
Zip1.zip/text1
Zip1.zip/text2
Zip1.zip/Zip2.zip/Sample1
Zip1.zip/Zip2.zip/Sample2
Run Code Online (Sandbox Code Playgroud)

jor*_*orb 2

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())'
Run Code Online (Sandbox Code Playgroud)

补充:Java jar 工具可以从 stdin 读取。从这个答案中窃取。

例如:

unzip -p Zip1.zip  Zip1/zip2.zip| jar -t
Run Code Online (Sandbox Code Playgroud)

输出:

zip2/
zip2/Sample2
zip2/Sample1
Run Code Online (Sandbox Code Playgroud)

原始压缩文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

从您的评论找到了相关的 Serverfault 线程。


这不是 shell 脚本,但它执行了原始问题中建议的操作:

unzip -p Zip1.zip Zip1/zip2.zip| python -c 'import zipfile,sys,StringIO;print "\n".join(zipfile.ZipFile(StringIO.StringIO(sys.stdin.read())).namelist())'
Run Code Online (Sandbox Code Playgroud)
unzip -p Zip1.zip  Zip1/zip2.zip| jar -t
Run Code Online (Sandbox Code Playgroud)