zip/unzip:跨平台归档本节摘要:
zip是 Windows 世界的「归档标准」——双击即解、系统原生支持、人人会用。在纯 Linux 环境里,tar.gz更主流;但只要涉及「传给 Windows 用户」「收 Windows 发来的压缩包」,zip就是最省心的选择。本节要讲清 zip 与 tar 的本质差别:zip 自带压缩(打包+压缩一体)、随机访问(能不解包直接看里面某个文件),但压缩率通常略逊于 tar+xz。理解这些取舍,你就知道何时该用 zip、何时该用 tar.gz。
内容来源:综合
zip/unzip相关知识整理,套用体系化模板。
阅读完本节,你应当能够:
zip 创建归档(打包+压缩一体),并用 -r 递归包含目录。unzip 解压、-l 列出内容、-d 指定解压目录。-O 选项)。tar 和 zip 解决同一个问题(把多文件合成一个),但设计哲学截然不同:
tar(顺序流):把文件顺序拼接成一个流,打包与压缩分离。优点是简单、灵活(可配合任意压缩器);缺点是只能顺序访问——想看 tar 包里第 100 个文件,得先把前 99 个读过去。
zip(随机访问):每个文件单独压缩后,加上一个「中央目录」索引放在末尾。优点是随机访问(能直接跳到某个文件不解压其他)、打包与压缩一体;缺点是压缩率略低(每个文件单独压,无法跨文件找冗余)、格式相对复杂。
这个设计差异决定了各自的适用场景:
| 特性 | tar | zip |
|---|---|---|
| 压缩 | 打包与压缩分离(.tar.gz) |
自带压缩(一体) |
| 随机访问 | 不支持(必须顺序读) | 支持(能单独提取某文件) |
| Windows 支持 | 需装 7-Zip 等工具 | 系统原生支持 |
| Linux 主流 | 是 | 否(跨平台时用) |
| 压缩率 | 高(配合 xz) | 中(每文件单独压) |
| 追加文件 | 麻烦(需重新打包) | 方便(zip -u 直接追加) |
zip archive.zip file1 file2 # 把几个文件压进 archive.zip zip -r archive.zip project/ # -r 递归, 包含目录(必备选项) zip -e secret.zip secret.txt # -e 加密码(会提示输入) zip -u archive.zip newfile.txt # -u 往现有 zip 追加/更新文件
💡 技巧:压目录务必加
-r,否则只压了空目录壳,里面的文件全漏掉——这是 zip 最常见的坑。
unzip archive.zip # 解压到当前目录 unzip archive.zip -d /opt/ # -d 指定解压目录 unzip -l archive.zip # -l 只列出内容, 不解压 unzip archive.zip file.txt # 只解压其中的 file.txt(随机访问!)
zip 的「随机访问」在这里体现得淋漓尽致——unzip archive.zip file.txt 直接提取单个文件,不用解开整个包。tar 做不到这点。
unzip -l archive.zip # 列出内容(文件名/大小/日期) unzip -t archive.zip # -t 测试完整性(校验 CRC), 下载后必做
zip proj.zip project/ # 错! 只压了空目录 zip -r proj.zip project/ # 对! 递归包含所有内容
Windows 创建的 zip 用 GBK 编码文件名,Linux 默认 UTF-8,解压时中文会变乱码:
unzip -O GBK archive.zip # -O 指定原编码为 GBK unzip -O CP936 archive.zip # CP936 是 GBK 的另一名字
反向:Linux 创建给 Windows 的 zip,中文也可能乱码。最稳妥是文件名用 ASCII,或双方约定编码。
tar -cJf proj.tar.xz project/ # 压缩率最高 zip -r proj.zip project/ # 压缩率中等, 通常比 xz 大 20-30%
如果你只追求「压得小」,且不涉及 Windows,tar+xz 是更好的选择。zip 的优势在「跨平台 + 随机访问」,不在压缩率。
zip 的中央目录设计,在文件极多(几万)时会有性能问题。海量小文件归档,tar 更合适。
-r:zip -r archive.zip project/,否则只压空壳。unzip archive.zip 单文件 能直接提取,不必全解。unzip -O GBK 指定原编码。下一节讲生产环境的事实标准——rsync 的增量同步机制,它是备份与镜像的利器。