跳转到内容

归档与压缩:tar 与 gzip 的关系

.tar.gz.tgz 这类扩展名经常被当作一个整体来理解,但它实际上是两个独立步骤依次处理的结果:先用 tar 完成归档,再用 gzip 完成压缩。理解这两步各自在做什么,能减少不少对相关命令参数的死记硬背。

归档:把多个文件合并成一个文件

Section titled “归档:把多个文件合并成一个文件”

tar(Tape Archive)最初是为磁带备份设计的工具,核心功能是把多个文件和目录打包合并成一个文件,同时保留原有的目录结构、文件权限等元信息。这个过程本身不涉及压缩——打包之后的 .tar 文件体积基本等于原始文件体积之和,只是从“很多个文件”变成了“一个文件”,更方便传输和管理。

Terminal window
tar -cf archive.tar dir/ # 把 dir 目录打包成 archive.tar,不压缩
tar -xf archive.tar # 解包 archive.tar
tar -tf archive.tar # 不解包,只列出归档内包含的文件列表

压缩是归档之后的可选步骤,gzip 是 Linux 上最常见的压缩工具之一,通过特定算法减少文件体积。tar 本身内置了对几种常见压缩算法的支持,不需要先手动 tar 打包、再单独调用 gzip 压缩这两条命令分开执行:

Terminal window
tar -czf archive.tar.gz dir/ # 打包并用 gzip 压缩(c=创建,z=gzip,f=指定文件名)
tar -xzf archive.tar.gz # 解压并解包(x=解包,z=gzip,f=指定文件名)
tar -cjf archive.tar.bz2 dir/ # 打包并用 bzip2 压缩(压缩率通常更高,速度更慢)
tar -cJf archive.tar.xz dir/ # 打包并用 xz 压缩(压缩率进一步提升)

-z-j-J 分别对应 gzip、bzip2、xz 三种不同的压缩算法,压缩率和压缩/解压速度各有取舍:gzip 速度快但压缩率一般,xz 压缩率更高但耗时更长,bzip2 介于两者之间。日常使用中 .tar.gz 是最常见的选择,兼顾了速度和通用性。

一个容易搞混的点:压缩率与压缩对象

Section titled “一个容易搞混的点:压缩率与压缩对象”

gzip 单独使用时(不通过 tar),只能压缩单个文件,不能直接压缩整个目录——这也是为什么处理目录时通常需要先用 tar 归档成一个文件,再对这一个文件做压缩。如果直接对一个目录执行 gzip,会得到报错提示,而不是打包压缩整个目录的结果。

Terminal window
ls -lh archive.tar archive.tar.gz

对比压缩前后的文件大小,能直观看出所选压缩算法对当前这批数据的实际压缩效果——文本类文件(源代码、日志)压缩率通常较高,已经是压缩格式的文件(如图片、视频)再次压缩收益很小,甚至可能因为压缩格式本身的开销导致体积略微增大。

这个主题是构建可靠 Linux 开发流程的重要组成部分。对它有清晰的理解,会让后续任务变得更容易,因为你能更快地判断某一步是否缺失或使用不当。

  • 在安全的测试环境中尝试这里展示的命令和配置。
  • 比较这些概念在不同发行版或工具之间的适用差异。
  • 记下一次实践中哪些步骤成功,哪些失败,这样下次遇到问题时更容易定位。
  • 将这篇文章与系列中相关内容结合起来,加深整体理解。
  • 跳过验证步骤,默认系统已经配置正确。
  • 不对命令中的路径、软件包名称或工具版本进行适配,直接复制粘贴执行。
  • 把这个主题当成孤立的技巧,而不是整个开发流程的一部分。