unzip 是什么
unzip 是 Info-ZIP 项目的 .zip 解压工具,zip 格式由 PKWARE 定义,Windows 资源管理器原生支持,所以它是「交付给客户、跨平台分发」时最省事的压缩格式。zip 把中央目录写在文件尾部,因此不解压就能用 unzip -l 列出全部条目与压缩前后大小。代价是元数据很弱:文件名编码由打包方决定,Windows 用 GBK 打包的中文名在 Linux 上要显式指定编码才能正确还原;Unix 的属主、软链接等属性也只能部分保留,所以部署脚本仍以 tar.gz 为主。
基本信息
| 适用平台 | Linux/macOS 用 Info-ZIP 的 unzip;Windows 用系统自带解压或 7-Zip |
|---|---|
| 命令语法 | unzip [选项] 包名.zip [-d 目标目录] [-x 排除模式] |
| 常用选项 | -l 只列目录 -t 测试完整性 -o 覆盖不询问 -n 不覆盖已存在 -q 静默 -O CP936 指定文件名编码 |
| 所属 | Info-ZIP(开源实现,多数发行版需单独安装 unzip 包) |
| 权限说明 | 写入 /var/www、/opt 等系统目录需 sudo;在 Unix 上打包的 zip 解压时会按包内记录还原权限位 |
典型使用场景
- 交付与上线:收到客户或同事发来的 zip,先 unzip -l 确认内容再解到部署目录
- 覆盖式更新:前端产物用 unzip -o -d /var/www/site 覆盖旧文件,省去逐个替换
- 完整性预检:unzip -t 只校验 CRC 不解压,下载损坏的包能在写盘前发现
- 批量解压:脚本里 for f in *.zip 循环配合 -d 指定各自的输出目录
- 中文名还原:Windows 打包的中文文件名乱码时,用编码参数或 7z 转码解压
常用示例
常用示例
unzip -l delivery.zip # 先列表:条目、大小、时间、路径
unzip -t delivery.zip # 只校验完整性,不解压
unzip delivery.zip -d /opt/delivery # 解到指定目录
unzip -o update.zip -d /var/www/site # 覆盖同名文件(自动化常用)
unzip -q site.zip -x '*.log' 'cache/*' # 静默并排除指定条目
unzip -O CP936 legacy.zip -d legacy # 还原 GBK 中文名(需实现支持)
7z x -mcp=936 legacy.zip -olegacy # unzip 不支持 -O 时的替代列表输出逐列读法
| 列 | 含义 | 怎么看 |
|---|---|---|
| Length | 条目解压后的字节数;末尾 Summary 的 Length 是包总大小 | 与压缩后大小对比可粗看压缩率 |
| Date / Time | 打包时记录的修改时间 | 判断交付版本新旧,注意时区可能差 8 小时 |
| Name | 包内相对路径,含目录层级 | 重点检查是否出现 ../ 或 /etc 开头的条目 |
| Summary 行 | 文件总数与总大小 | 数量对不上说明打包时漏了文件或多了中间产物 |
-O 编码参数不是所有发行版的 unzip 都编译支持(Debian/Ubuntu 的 unzip 常不带),先 unzip -v 看帮助里的选项清单;不支持时改用 7z x -mcp=936 或 python3 -c 配合 zipfile 指定编码。
解压会把包内路径直接落到磁盘:条目里含 ../ 或绝对路径时可覆盖目标目录以外的文件。来源不可信的 zip 一律先 unzip -l 看路径,再用 -d 解到一个新建的空目录。