【超详细】搞懂tar、tgz、zip、rar、7z归档压缩格式,理清跨平台踩坑根源
文章目录
- 1、先分清归档与压缩,很多初学者的概念误区
- 1.1 归档与压缩二者完全是两件独立工作
- 1.2 两套技术路线诞生的历史背景
- 2、tar家族格式完整拆解:tar / tar.gz / tgz / tar.bz2 / tar.xz
- 2.1 tar归档格式,只打包不压缩
- 2.2 gzip介入之后,tar.gz与tgz格式由来
- 2.3 tar系列常用命令与高频报错场景
- 3、zip、rar、7z:PC生态主流归档压缩格式
- 3.1 zip格式,跨平台通用的主流方案
- 3.2 rar私有闭源格式的优势与局限
- 3.3 7‑Zip与7z开源高压缩格式
- 4、跨平台开发实战:Windows、WSL交互下大量真实踩坑
- 4.1 Windows解压tar/tgz之后,复制进WSL程序无法运行
- 4.2 不同业务场景,归档压缩格式选型参考
- 4.3 工具选型的补充提示
- 5、归档压缩格式发展时间线梳理
1、先分清归档与压缩,很多初学者的概念误区
1.1 归档与压缩二者完全是两件独立工作
绝大多数新手会把归档、压缩混为一谈,认为所有后缀带.tar、.zip的文件全都是“压缩文件”,实际二者要完成的任务完全不一样。
归档(Archive):把一堆零散文件、子目录合并收纳进一个单独文件。归档只负责打包收纳,不会减小文件体积。它会记录目录层级、各类附属元信息,方便备份、批量传输大量零散文件。类比:把一堆书本整齐装进纸箱,书本本身重量、体积不会发生变化。
压缩(Compress):通过特定算法修改文件内部二进制数据,消除冗余信息,降低文件占用磁盘空间。类比:把纸箱里面的书本做挤压,整体箱子体积变小。
部分格式可以一步同时完成归档+压缩,例如zip、7z。Unix生态里面的tar体系遵循“一个工具只做好一件事”的设计理念:tar只做归档打包,压缩交给gzip、bzip2这类独立程序完成,所以出现.tar.gz、.tgz这种组合产物。
1.2 两套技术路线诞生的历史背景
PC个人电脑生态,从早期IBM‑PC时代就追求简单易用,一个工具同时完成打包+压缩,诞生zip格式,Windows系统原生支持,这也是普通用户日常最常接触的格式。
而tar诞生于70年代大型机磁带备份场景,诞生在Unix操作系统环境下。磁带属于顺序读写存储设备,不能像硬盘一样随意跳转读取零散小文件,必须把大量小文件拼接成连续字节流写入磁带,tar工具就是为解决这个场景开发。
这里需要做一个说明:文章后续会涉及一部分Unix相关概念,不是为了讲解完整操作系统课程。只是tar这套格式诞生于Unix,它会保存Unix独有的文件元数据(权限、软链接、属主),正是这些元数据,造成Windows与WSL/Linux交互时大量莫名其妙的故障。理解这部分元数据,是解决跨平台解压报错、程序无法运行的关键,并不是额外拓展无关知识点。
2、tar家族格式完整拆解:tar / tar.gz / tgz / tar.bz2 / tar.xz
2.1 tar归档格式,只打包不压缩
tar全称Tape ARchive,1975年作为Unix V7系统内置工具对外发布,最初目标服务于磁带机备份。
执行归档的时候,tar会把目录树下全部文件拼接成单一流式文件,同时保存一套Unix专属元信息:文件读写执行rwx权限、文件所有者用户与用户组、文件时间戳、符号链接。原生tar不做任何压缩,打包之后总文件大小≈全部原始文件相加总和,后缀为.tar。
Windows文件系统不存在rwx权限、软链接这一套机制。所以当你在Windows解压tar包,这些Unix专属元信息会直接全部丢弃。这是后续跨平台踩坑最核心的源头。
2.2 gzip介入之后,tar.gz与tgz格式由来
仅仅完成归档,文件体积没有缩减,存储、网络传输成本很高。1992年GNU项目推出gzip压缩工具,使用DEFLATE算法,专门做单文件数据流压缩。
工程上形成标准操作流程:
第一步,使用tar,把大量文件、目录打包生成未压缩tar归档文件;
第二步,调用gzip,对整个tar归档文件做整体压缩。
得到产物就是.tar.gz,行业内嫌后缀名字过长,创造简写后缀.tgz。.tar.gz与.tgz二进制数据完全一模一样,仅仅后缀书写名字不同,可以互相改名互换使用。
顺着这套两步式思路,后续出现更多压缩方案与对应的后缀:
- bzip2算法,压缩率高于gzip,运算速度更慢 →
.tar.bz2 - xz算法,压缩能力最强,但是消耗CPU资源更高 →
.tar.xz
以上全部格式底层都依靠tar完成归档,再调用外部压缩工具处理。tar工具提供参数封装这套流程,不需要用户手动分两步敲命令。
2.3 tar系列常用命令与高频报错场景
处理纯粹未压缩的.tar归档包,不能带上代表gzip解压的‑z参数:
# 解压纯tar包tar-xvfdemo.tar# 创建tar归档包tar-cvfdemo.tar ./target_folder处理.tgz/.tar.gz,增加‑z参数启用gzip解压逻辑:
# 解压tgz/tar.gztar-zxvfdemo.tgz# 打包并且gzip压缩输出tgztar-zcvfdemo.tgz ./target_folder新手最容易踩坑:把未压缩tar包带上‑z参数,程序尝试执行gzip解压,直接抛出解压失败报错。
tar格式另外一个局限:老式tar实现为完整流式读取,想要提取包内单个文件,需要从头到尾扫描整个归档,不能随机定位读取。zip格式不存在这个问题,可以直接提取包内任意单个文件。
3、zip、rar、7z:PC生态主流归档压缩格式
3.1 zip格式,跨平台通用的主流方案
zip格式1989年由Phil Katz发布,对应工具PKZIP,面向早期IBM‑PC个人计算机设计。
zip设计逻辑和tar体系有本质区别:不需要分开归档、压缩两步操作。zip可以读取每一个独立文件,逐个完成压缩,再收纳进归档包内部。
该设计带来两大优势:
第一,支持随机访问,可以直接提取压缩包里面某一个单独文件,不需要完整解压全部内容。
第二,从设计之初就考虑跨平台兼容性,不存储Unix专属的权限、属主、软链接元数据。Windows从Win95版本开始系统原生支持zip解压,macOS、Linux也自带zip/unzip工具。
正因为不会保存Unix权限信息,如果你把Linux可执行程序打包为zip,解压到Linux/WSL之后,程序不会自带可执行标记,依然需要手动执行chmod +x赋予权限。
3.2 rar私有闭源格式的优势与局限
rar格式1993年由俄罗斯开发者Eugene Roshal开发,算法属于私有闭源专利。在早年硬件条件下,rar压缩效果优于zip格式。借着WinRAR软件普及,在国内Windows普通用户群体广泛流行。
它支持分卷压缩、损坏包修复、高强度加密这些实用特性。但是闭源属性带来明显短板:Linux、macOS系统没有系统自带解压工具,必须额外安装第三方程序。
开源项目、学术数据集几乎不会选择rar作为分发格式,规避专利授权带来的额外依赖风险。工程开发场景,不建议把rar作为项目分发格式。
3.3 7‑Zip与7z开源高压缩格式
7‑Zip工具以及7z格式1999年对外公开,整套方案完全开源免费,使用LZMA压缩算法,同等条件下压缩效果通常优于zip、rar。
7‑Zip工具是多格式兼容工具,不仅可以生成7z包,还可以解压tar、tgz、zip、rar几乎市面上绝大多数归档格式。Win10系统没有原生支持7z,需要手动安装7‑Zip;Win11已经增加原生7z支持。
7z适合追求高压缩率,同时希望避开闭源专利的场景。
4、跨平台开发实战:Windows、WSL交互下大量真实踩坑
4.1 Windows解压tar/tgz之后,复制进WSL程序无法运行
这是很多新手接触Linux项目、MIREX这类老旧数据集时高频遇到的现象。
原因:.tar、.tgz包内部保存Unix的rwx执行权限标记。Windows文件系统不识别这套元数据,在Windows资源管理器解压的时候,权限标记会直接被丢弃。把解压完成的文件拷贝进WSL,二进制程序缺少执行权限,无法启动。
有两种处理方案:
方案一,不把tgz包在Windows解压,直接把完整的.tgz文件复制到WSL内部目录,在WSL终端执行tar解压,权限信息完整保留,推荐优先采用该方案。
方案二,已经在Windows解压完成,拷贝到WSL之后,手动赋予执行权限:
chmod+x your_binary_program延伸知识点:不仅仅是二进制程序,shell脚本
.sh同样依赖这套执行权限标记,同样会出现该问题。
4.2 不同业务场景,归档压缩格式选型参考
面向普通Windows用户互相传递文档、资料:优先选择zip。Win10、Win11原生支持,不需要额外安装软件,兼容性最好。
开源项目、学术音频图像数据集、WSL/Linux服务器资源分发:优先选择**.tar.gz(tgz)**,这是类Unix生态事实标准。
需要极高压缩率,同时规避私有专利约束:选择7z格式。
工程分发尽量避开rar格式,跨平台依赖复杂,会给使用者带来额外部署负担。
4.3 工具选型的补充提示
Win11资源管理器原生支持tar、tgz、7z解压;Win10系统需要安装7‑Zip或者Bandizip。
不要使用Windows解压之后再修改Linux项目源码:Windows文件系统和Linux权限模型完全不同,修改完成再拷贝回WSL,会产生一系列难以排查的权限异常。
5、归档压缩格式发展时间线梳理
1975:tar工具诞生于Unix V7,仅做归档打包,无压缩能力,面向磁带备份。
1989:zip格式发布,面向PC个人电脑,归档压缩一体化。
1991:Linux内核发布,继承Unix全套工具链,tar得到大规模普及。
1992:gzip发布,tar+gzip组合,.tar.gz/.tgz格式开始广泛使用。
1993:rar私有闭源格式诞生。
1999:7‑Zip、7z开源格式对外发布。
可以看到,tar家族全部工具根源于早期Unix系统设计理念。Windows生态和Unix生态两套体系的设计目标不一样,元数据模型存在差异,这也是Windows日常很少见到tar包,但是一接触开源、科研数据集就频繁遇到tar包的根本原因。
很多初学者只记命令,没有分清归档和压缩两个概念,遇到跨系统文件传输,碰到程序无法执行、解压报错,不知道故障根源来自归档包携带的系统元信息。理清各个格式诞生背景、存储内容,遇到异常时就可以快速定位问题。
你在WSL或者处理各类开源数据集的时候,有没有遇到过解压之后脚本或者二进制程序无法运行的情况?欢迎留言交流。
