在 Linux 里,tar 命令可以说是一个绕不开的“老伙计”。不过,用过的人都知道,它的参数选项多到让人眼花缭乱——不仅种类繁杂,像 C 语言 printf 函数的格式化输出符号一样又多又难记,而且还得在短时间内判断文件类型、选对合适的参数。很多刚接触 Linux 的人只看一眼 man tar 的内容,就忍不住头皮发麻。
这完全可以理解,因为这个手册写的我也看不懂 tar 命令的设计就像一把多功能的瑞士军刀,它既要处理纯粹的归档(把文件打包),又要兼顾压缩(给打包文件“瘦身”),还要能在解包时自动识别压缩类型。结果就是,我们不得不面对 -z、-j、-J、--xz、--gzip 这一大堆令人困惑的选项。
不过别担心,我们并不需要把它们全部背下来。只要掌握几个最常用的固定搭配,就足以应对 90% 的日常场景。
压缩文件常有的类型
在 Windows 上,压缩文件大多以 .zip, .rar 和 .7z 结尾。我们天天和这些类型的压缩文件打交道,也有专门的软件(如 7zip, peazip, WinRAR, 甚至 Windows 10 以上自带的文件管理器等)来管理它们。
在 Linux 上,事情就大不相同了。这里更常见的压缩文件格式是 .tar、.tar.gz、.tar.bz2 和 .tar.xz(还有 .tar.zst,这是 Arch Linux 及其衍生发行版常用的一种打包格式,这里我们不讨论)。这些格式的名字看起来可能有点让人困惑,尤其是在某些情况下它们还被简称为 .tgz、.tbz2 或 .txz。
不过别担心,它们的核心其实都离不开那个我们刚刚认识的 tar 命令。接下来,我们就一起看看这些格式到底有什么区别,以及如何用 tar 这个“瑞士军刀”来轻松应对它们。
什么是 .tar, .tar.gz, .tar.bz2, .tar.xz 格式?
简单来说,.tar、.tar.gz、.tar.bz2 和 .tar.xz 之间的关系,可以理解为 “打包” 和 “压缩” 两步走。
第一步:打包 - 诞生 .tar 文件
想象一下,你要寄一大堆零散的小物件。最方便的做法是先把所有东西装进一个大箱子,这就是打包。
在 Linux 里,tar 命令的本职工作就是这个。它能把一大堆文件和文件夹打包成一个单一的文件,这个文件就叫 tarball(也就是 .tar 文件)。这个过程只合并,不压缩,所以文件大小基本等于所有内容的总和。.tar 文件的唯一目标就是“化零为整”,便于管理。
第二步:压缩 - 诞生压缩文件
现在,你有了一个大箱子(.tar 文件),为了节省运输空间(磁盘空间),你需要把它压缩一下。
接下来的 .tar.gz, .tar.bz2, .tar.xz 格式,其实就是把这个“大箱子”用不同的压缩工具进行压缩后的结果。
.tar.gz: 这是最经典、最通用的格式。它使用 gzip 算法对
.tar包进行压缩。它的特点是速度快,但压缩率相对一般。可以把它看作是“标准纸箱压缩服务”。.tar.bz2: 它使用 bzip2 算法进行压缩。相比 gzip,它的压缩率更高(文件更小),但压缩和解压的速度会慢一些,且更消耗 CPU。可以理解为“高强度压缩服务”,箱子更小但打包/拆包更费时。
.tar.xz: 这是目前的“压缩率冠军”,使用最新的 xz 算法。它能提供最高的压缩率,生成最小的文件,但代价是速度最慢,对计算资源的消耗也最大。非常适合用于发布大型软件(或者镜像文件)或需要极致节省空间且不常访问的归档。
如何打包并压缩一堆文件?
打包并压缩文件的命令其实非常直接且有规律可循。
如何打包成 .tar 文件
我们可以使用下面的命令将一大堆文件(包括文件夹)打包成一个 .tar 文件:
tar cf your-file-name.tar your/path/to/file这个命令是什么意思呢?
其实很简单:
tar:调用我们的打包工具c:代表 create,意思是创建新的归档文件f:代表 file,后面要指定生成的文件名your-file-name.tar:这是最终生成的打包文件名,你可以自由命名your/path/to/file:这是你要打包的文件或目录路径,支持通配符如*.txt
举个例子,如果你想将当前目录下的 documents 文件夹打包成 my-docs.tar,只需要这样:
tar cf my-docs.tar documents稍等片刻,一个完整的 .tar 文件就诞生了!它就像把一个完整的文件夹“装进”了一个独立的箱子里,方便你搬运和存储。
如何压缩成 .tar.gz 文件
前面我们说过, tar 只是进行了打包,并没有压缩整个文件。一种解决方法是使用业界惯用的 gzip 算法将整个文件夹压缩成 .tar.gz 文件。我们只需要在之前命令的选项中加入 z:
tar czf my-docs.tar.gz documents其中,z 代表使用 bzip 算法进行压缩。此时文件格式必须是 .tar.gz 或 .tgz。
如何压缩成 .tar.bz2 文件
如果你想要更高的压缩率,那么可以使用 bzip2 算法。我们只需要将之前的 z 换成 j:
tar cjf my-docs.tar.bz2 documents其中,j 代表使用 bzip2 算法进行压缩。此时文件格式必须是 .tar.bz2 或 .tb2/.tbz2.
它的压缩速度比 gzip 慢一些,但生成的压缩包更小。
如何压缩成 .tar.xz 文件
xz 是一种新兴的压缩算法,可以提供相比于 bzip2 算法更高的压缩率。要使用该算法,需要将 j 换成 J(注意大小写!):
tar cJf my-docs.tar.xz documents其中,J 代表使用 xz 算法进行压缩。此时文件格式必须是 .tar.xz 或 .txz.
这是目前压缩率最高的常见格式之一,尤其适合用于分发大型软件或长期归档,不过压缩和解压所需的时间也相对更长。
如何解压压缩文件?
这一步其实比压缩更简单。
你只需要记住,把打包时用的 c (create) 换成 x (extract) 就可以了。
基于这个逻辑,我们可以轻松推导出解压命令:
解压 .tar 文件
tar xf your-file.tar解压 .tar.gz 文件
tar xzf your-file.tar.gz解压 .tar.bz2 文件
tar xjf your-file.tar.bz2解压 .tar.xz 文件
tar xJf your-file.tar.xz这里的选项很好理解:
x:解压f:指定文件名z/j/J:分别对应 gzip、bzip2、xz 压缩算法
总结一下
tar 命令的用法其实很有规律:
打包压缩用
c+ 压缩算法选项 +f解压提取用
x+ 压缩算法选项 +f
为了方便,你还可以加上 v 选项(verbose)来显示解压过程的详细文件列表(随便写选项中的哪里)。虽然选项看起来很多,但掌握了这个“创造”与“提取”的对称逻辑,tar 命令就不再令人头疼了!