← 返回首页

ZIP、7z 与 tar.gz 有什么区别?从格式选择到安全解压

收到一个压缩包时,人们经常先问“用什么软件打开”。更值得先问的其实是:文件从哪里来、里面可能有什么、准备把它放在哪里。解压不是单纯的查看操作,它会创建文件,可能覆盖同名内容,也可能带来你并不想执行的程序。

本文按“理解格式、选择工具、检查内容、独立解压”的顺序介绍日常处理方法。命令是操作示例,不代表本文进行了性能测试;请先替换文件名,并确认本机工具的版本和帮助说明。

一、先分清归档、压缩和加密

归档是把多个文件和目录组织成一个容器,方便传输并保存一定的目录信息。压缩是用更紧凑的表示减少数据体积。加密则是控制没有密钥的人能否读取内容。这三件事可以组合,却不能互相代替。

一个 ZIP 文件可以使用“不压缩”的存储方式;一个压缩得很小的文件也未必加密;有密码的压缩包仍然可能包含恶意程序。文件名后缀只提供线索,把 .7z 改成 .zip 不会转换内部格式。

ZIP:先考虑接收者能否方便打开

ZIP 适合交换文档、照片和一般资料。选择它的实际理由往往是接收方已经有可用工具,而不是它在每一组文件上都能达到最小体积。

同为 ZIP,不同压缩方法、加密方式以及扩展特性仍可能影响兼容性。不要把“支持 ZIP”理解为“支持所有 ZIP 变体”。如果需要发给不熟悉工具的人,先用少量不敏感样本确认对方能打开,比事后补发整个大包更省时间。7-Zip 官方页面列出了其可创建、可解压的格式,并说明 ZIP 与 7z 的加密支持。

7z:适合双方已经确认工具的场景

7z 支持多种压缩方法、Unicode 文件名、固实压缩与 AES-256 加密。固实压缩可以把多个文件的数据组织在一起压缩;是否划算取决于文件内容、参数以及后续访问方式,不能仅凭扩展名承诺节省比例。具体功能可查阅官方 7z 格式说明。

例如,一批内容相近的文本与一批已经压缩过的视频,并不是同一种工作负载。需要反复提取单个文件、经常更新内容,或接收方只有系统自带工具时,应把便利性也算进选择,而不是只看压缩包大小。

tar.gz:先归档,再压缩

.tar.gz 表示常见的两层结构:先由 tar 组织目录和文件,再由 gzip 压缩归档数据。.tgz 通常是它的简写。只解除 gzip 这一层时,得到的是 tar 归档,未必已经恢复出里面的文件。

gzip 不是通常意义上的多文件目录归档工具。GNU gzip 手册建议,需要组织并独立提取多个文件时使用 tar 或 zip 等归档工具。tar.gz 常见于源码和类 Unix 环境的资料分发,但“能保存哪些元数据”和“提取后实际恢复了什么”仍取决于工具、权限及目标文件系统。它也不是一套完整备份方案,更不自带保密保证。

二、解压前先做四项判断

第一,确认来源。优先从项目或服务的官方渠道获取文件。别人转发的下载链接、文件图标和好听的文件名,都不能证明内容可信。若发布方提供校验值,应从可信渠道获取并核对;校验一致不等于文件没有恶意行为。

第二,更新解压工具。预览列表本身也需要解析压缩包,不能把“只看看文件名”当成绝对安全的隔离措施。对明显可疑、来历不明的附件,不应为了满足好奇心在日常工作电脑上试开。

第三,观察预计展开体积与文件数量。几十兆的包不一定只占几十兆磁盘空间。空间不够时不要反复尝试到磁盘被写满;数量异常、嵌套层级异常或展开规模远超预期,都值得先停止并核对来源。

第四,明确目标目录。不要把第一次收到的包直接解压到桌面、代码项目、网站目录或系统目录。每个包使用一个新的空目录,也不要让不同来源的包共享同一个提取目录。

三、Windows:把 ZIP 解压到一个新位置

对于已经确认来源的 ZIP,可以在 PowerShell 中使用下面的示例。假定压缩包在当前目录,目标名称尚未存在:

Get-Location
Test-Path -LiteralPath '.\review-zip-20261104'

如果第二条返回 True,先换一个新的目标名称,不要继续把包混进已有目录。确认返回 False 后,再执行:

Expand-Archive -LiteralPath '.\documents.zip' -DestinationPath '.\review-zip-20261104'

-LiteralPath 用于按字面解释源路径,避免文件名中的通配符字符改变匹配范围。这里没有使用 -Force,也没有要求自动覆盖已有文件。微软的 Expand-Archive 文档说明了目标目录与覆盖参数的行为。

这条命令针对 ZIP,并不意味着把后缀换成 .7z 或 .tar.gz 就能使用。处理 7z 时,可以在已更新的 7-Zip 图形界面中先浏览内容,再选择明确的新目录。不要为了打开压缩包去运行来源不明的“专用解压器”。

四、Linux:查看 tar.gz,再独立提取

下面示例明确针对 GNU tar。macOS 常见的是另一种 tar 实现,不应直接套用所有 GNU 长选项;请先查看本机 tar --help 或 man tar。

先列出内容,不把文件提取到磁盘:

tar -tzf './materials.tar.gz'

注意目录层级、异常绝对路径、包含 .. 的成员名,以及与预期无关的脚本或可执行文件。文件名看似正常也不构成安全保证。

确认需要继续后,可以在自己的主目录下创建随机命名的私有目录,再提取:

(
  umask 077
  out=$(mktemp -d "$HOME/archive-review.XXXXXXXX") || exit 1
  printf '解压目录:%s\n' "$out"
  tar --extract --gzip --file='./materials.tar.gz' \
      --directory="$out" --no-same-owner --no-same-permissions
)

该示例不使用 sudo,不要求保留来源文件的属主和完整权限,也不提供自动覆盖或删除目标内容的操作。创建的目录会保留下来,方便你手动检查。若命令报错,先读错误信息,不要通过提升权限来“试试看”。

新目录只能降低风险,不能替代沙箱。尤其不要关闭工具对绝对路径、目录穿越和链接的保护。GNU tar 的安全建议强调独立空目录、可信父目录及谨慎使用危险选项;对真正不可信的归档,应使用受控的隔离环境,或直接不处理。

五、解压成功后还没有结束

先核对文件数量和目录结构,再打开所需资料。文档要求启用宏、脚本要求关闭防护、安装包要求管理员权限时,都应视为新的操作决定,而不是解压流程里可以顺手点过的一步。

如果需要把文件放入现有项目,先比较同名文件,再选择性复制。不要用“全部替换”来解决不理解的目录冲突。准备删除压缩包前,还应确认重要资料已有独立备份;压缩包与展开文件位于同一块磁盘,并不能防止磁盘损坏造成的同时丢失。

日常选择可以很简单:优先交换便利时考虑 ZIP;双方工具一致、重视压缩配置时考虑 7z;在类 Unix 工具链中分发目录时考虑 tar.gz。但无论选哪一种,来源核对、最新工具、独立目录和不自动执行内容,始终比扩展名本身更重要。

写于此,留待再读。