unzip
unzip是用于从ZIP格式压缩包中解出原始文件的解压缩程序,最常见的实现是Info-ZIP小组开发的开源命令行工具UnZip。它读取ZIP归档中的文件头与中心目录,按各条目记录的压缩方法还原数据,并用CRC-32校验完整性。由于ZIP是跨平台通用的归档格式,UnZip被移植到大量操作系统,多数Linux与Unix发行版自带的unzip即为该实现。
定义
unzip指一类把ZIP格式归档中的条目还原为原始文件与目录的程序,也特指Info-ZIP小组维护的同名命令行工具UnZip。它的输入是一个扩展名为.zip的文件,输出是解压后的文件集合,默认在当前工作目录下重建归档内部的目录层级[1]。
作为命令行程序,它的一般调用形式为给出程序名、若干选项和压缩包路径,选项用于控制列出内容、测试完整性、指定输出目录、排除特定文件以及是否覆盖已有文件等行为[2]。运行在ZipInfo模式时,程序改为输出归档内部结构信息而非解压数据[2]。
原理
ZIP归档把每个成员文件描述为一个本地文件块,其中先是本地文件头,记录文件名、压缩方法、压缩与未压缩尺寸、CRC-32 校验值以及修改时间等字段,随后才是该成员的实际数据[3]。各成员的数据之后是集中放置的中心目录,逐条重复记录文件头信息并给出本地文件头的偏移位置,归档末尾还有指示中心目录位置与长度的结束记录[3]。
解压的流程因此可以先定位中心目录,再按每条记录给出的偏移跳到相应数据块读取内容。压缩方法字段取 0 表示原始存储,取 8 表示使用DEFLATE算法,这也是实际归档中最常见的方式[4]。DEFLATE由LZ77字典编码与霍夫曼编码两级组合而成,解压时按相反顺序还原字节流[3]。
还原得到的字节还会按文件头记录的长度与 CRC-32 值进行核对,以此判断数据是否在传输或存储中受损;程序的测试选项正是只做这项校验而不写出文件[2]。当本地文件头中的通用标志位第 3 位被置为 1 时,尺寸与校验值并不写在前面的头部,而是紧跟在成员数据之后的数据描述符中,此时解压程序需要先读完数据再确定长度[5]。
flowchart LR
A[读取结束记录] --> B[定位中心目录]
B --> C[逐条读出成员记录]
C --> D[跳转到本地文件头]
D --> E[按压缩方法还原数据]
E --> F[CRC-32 校验]
F --> G[写出文件并重建目录]
发展历程
UnZip 1.0 于 1989 年 3 月由Samuel M. Smith发布,最初用Pascal与C两种语言编写,其中Pascal版本很快被放弃;随后推出的 2.0 版增加了对早期PKZIP所用压缩方法的支持,Unix版本由George Sipe完成[1]。1989 年 12 月,Carl Mascott与John Cowan发布了 2.0a 版[1]。
1990 年春季,Info-ZIP以SIMTEL20上的邮件列表形式形成协作组织,同年 5 月发布UnZip 3.0,这是该小组推出的首个公开版本;12 月发布的 4.0 版增加了对ZIP归档内中心目录的支持[1]。1992 年 8 月的 5.0 版首次支持DEFLATE方法,此方法此后成为ZIP归档事实上的基础标准[1]。
2000 年 4 月的 5.41 版改用Info-ZIP许可证重新授权,2002 年 2 月的 5.50 版加入Deflate64解压支持[1]。6.0 版发表于 2009 年 4 月 29 日,增加了对Zip64归档以及bzip2方法解压的支持,使可处理的单文件尺寸与成员数量突破原有的 32 位限制。
应用
unzip的典型用途是在服务器和开发环境中处理软件分发包。由于多数Linux和Unix发行版所附带的zip与unzip程序就是Info-ZIP的版本,解压ZIP包几乎是源码发布、安装脚本和构建流程中的常规步骤[1]。在无法使用图形界面的场景,例如远程登录或自动化脚本中,命令行解压是主要手段[6]。
具体操作上,程序支持只解出压缩包内指定成员、用通配符筛选文件、把结果写入指定目录、跳过原有目录层级以及用 -P 选项提供口令处理加密条目等用法[6]。配套的unzipsfx组件可以把解压逻辑附加到归档前面,生成双击即可自行展开的可执行归档,但其删去了帮助、列表等次要功能以压缩体积[7]。
局限
该程序只处理ZIP格式,向其传入其他格式的归档会以失败告终,因为不同归档格式的容器结构和压缩方法并不通用[8]。ZIP本身允许使用多种压缩方法,而解压方必须认识相应方法才能还原数据,较古老的reduce、shrink、implode等方法在部分构建中已被裁掉[7]。
文件名编码是另一个薄弱环节。ZIP规范只在通用标志位中提供UTF-8 标记,未置位时不强制规定文件名所用编码,历史上不少工具直接写入系统本地编码,于是在UTF-8 环境下解压常出现乱码,需要显式指定原编码才能正确还原名称[9]。
此外,压缩比只反映数据冗余程度,并不反映解压后的体积,构造出的归档可以在极小的压缩数据中展开出远超预期的内容,这一点在设计存储配额与解压流程时属于需要留意的属性[10]。程序还要求对源文件有读取权限、对目标目录有写入权限,权限不足或磁盘空间不够都会导致解压中断[11]。
参见
参考资料
- Info-ZIP是一套处理ZIP压缩文件的开源软件 [引用日期2026-10-29]
- man pages section 1: User Commands [引用日期2026-10-29]
- ZIP [引用日期2026-10-29]
- Adobe Flash Platform [引用日期2026-10-29]
- ZIP Archive # [引用日期2026-10-29]
- unzip [引用日期2026-10-29]
- man [引用日期2026-10-29]
- zip文件怎么解压缩,右键、命令行、第三方工具三条路径,附乱码与损坏包处理 [引用日期2026-10-29]
- Character encoding: Difference between revisions [引用日期2026-10-29]
- wikipedia.org 上的网页 [引用日期2026-10-29]
- 为什么ubuntu extract失败 [引用日期2026-10-29]