如何递归解压缩嵌套的 ZIP 文件?

How do I recursively unzip nested ZIP files?

鉴于在嵌套的 ZIP 文件中有一个秘密文件,即 zip 文件中的 zip 文件中的 zip 文件等...

zip 文件名为 1.zip2.zip3.zip 等...

我们不知道 zip 文件嵌套的深度,但可能有数千层。

遍历所有文件直到最后一个读取机密文件的最简单方法是什么?

我最初的方法是递归调用 unzip,但我的 Bash 技能有限。你有什么想法来解决这个问题?

可能不是最干净的方法,但应该可以解决问题:

#!/bin/sh
IDX=1 # ID of your first zip file
while [ 42 ]
do
    unzip $IDX.zip # Extract
    if [[ $? != 0 ]]
    then
        break # Quit if unzip failed (no more files)
    fi
    if [ $IDX -ne 1 ]
    then
        rm $IDX.zip # Remove zip to leave your directory clean
    fi
    (( IDX ++ )) # Next file
done

这是我的 2 美分。

#!/bin/bash

function extract(){
  unzip  -d ${1/.zip/} && eval  && cd ${1/.zip/}
  for zip in `find . -maxdepth 1 -iname *.zip`; do
    extract $zip 'rm '
  done
}

extract '1.zip'

谢谢赛勒斯!大巫师 Shawn J. Goff 对此有完美的剧本:

while [ "`find . -type f -name '*.zip' | wc -l`" -gt 0 ]; do find -type f -name "*.zip" -exec unzip -- '{}' \; -exec rm -- '{}' \;; done

检查这个基于 java 的实用程序 nzip 以获取嵌套的 zips。

提取和压缩嵌套的 zip 可以使用以下命令轻松完成:

java -jar nzip.jar -c list -s readme.zip 

java -jar nzip.jar -c extract -s "C:\project\readme.zip" -t readme 

java -jar nzip.jar -c compress -s readme -t "C:\project\readme.zip" 

PS. I am the author and will be happy to fix any bugs quickly.

这是 windows 的解决方案,假设 7zip 安装在默认位置。

@echo off
Setlocal EnableDelayedExpansion
Set source=%1
Set SELF=%~dpnx0
For %%Z in (!source!) do (
    set FILENAME=%%~nxZ
)
set FILENAME=%FILENAME:"=%

"%PROGRAMFILES%-zipz.exe" x -o* -y "%FILENAME%"

REM DEL "%FILENAME%"
rem " This is just to satisfy Whosebug code formatting!


For %%Z in (!source!) do (
    set FILENAME=%%~nZ
)
for %%a in (zip rar jar z bz2 gz gzip tgz tar lha iso wim cab rpm deb) do (
    
    forfiles /P ^"%FILENAME%^" /S /M *.%%a /C "cmd /c if @isdir==FALSE \"%SELF%\" @path"
)

改编自此处https://social.technet.microsoft.com/Forums/ie/en-US/ccd7172b-85e3-4b4a-ad93-5902e0abd903/batch-file-extracting-all-files-from-nested-archives?forum=ITCG

备注:

  1. 使用 ~ 修饰符进行变量修改的唯一方法是使用虚拟 for..in 循环。如果有更好的方法请编辑。
  2. ~nx修改变量使其成为全路径+文件名
  3. ~dpnx 也对 %0 做同样的事情,即获取脚本的完整路径和文件名。
  4. 7zip 命令行中的-o* 允许 7zip 创建没有 .zip 扩展名的文件夹名称,就像在 gui 中右键单击提取时一样。
  5. ~n 修改变量使其成为不带扩展名的文件名。即删除 .zip
  6. 请注意,FORFILES /P 中的转义字符(用于引号)是 ^(插入符号),而 CMD /C 中的转义字符是 \。这确保它也可以递归地处理带有空格的路径和文件名而不会出现任何问题。
  7. 如果你想在解压后删除zip文件,你可以在DEL语句中去掉REM。