如果你在Linux服务器上工作,每天都要和文件打交道,那么“打包”和“压缩”这两个词对你来说一定不陌生。你可能经常需要备份日志、分发代码,或者从网上下载一个以 .tar.gz 结尾的软件包。但你是否曾对 tar 命令那一长串参数感到困惑? -zcvf 和 -zxvf 到底有什么区别?为什么有时候解压会报错“gzip: stdin: not in gzip format”?又或者,你明明想压缩,结果却只打了个包,文件大小一点没变?
这些问题背后,其实是对 tar 这个“打包”工具和 gzip 、 bzip2 等“压缩”工具之间关系的混淆。很多人以为 tar 自己就能压缩,这是一个最常见的误区。 tar 的核心工作是“归档”,即把多个文件和目录“捆”成一个单一的文件( .tar ),而压缩是另一个程序(如 gzip )的工作。将它们组合使用,才诞生了 .tar.gz 或 .tgz 这样的经典格式。
本文将彻底厘清 tar 命令的打包与压缩逻辑。我不会只罗列参数手册,而是带你理解其设计哲学,并通过大量真实运维场景(如日志轮转、增量备份、排除特定文件)的示例,让你掌握从基础到进阶的完整技能链。你会发现,用好 tar 不仅能提升效率,更能避免在关键时刻(比如恢复备份)因命令使用不当而导致的数据风险。
1. 核心概念:打包与压缩是两件事
在深入命令之前,我们必须建立一个至关重要的认知: 在Linux世界中,打包(归档)和压缩是两个独立的步骤,通常由不同的工具完成。
打包(Archiving) :
- 目的 :将多个文件、目录及其元数据(权限、所有者、时间戳)合并成一个单一的文件。这个文件就像一个没有压缩的“箱子”,里面原封不动地装着所有东西。
- 工具 :
tar(Tape ARchive) 是完成此任务的标准工具。生成的文件后缀通常是.tar。 - 类比 :就像你用一个大文件夹,把一堆散落的文档、图片都装进去,然后封口。文件夹本身大小基本等于里面所有东西大小的总和。
压缩(Compressing) :
- 目的 :通过算法减少文件占用的磁盘空间。它作用于“一个”文件(可以是打包后的
.tar文件)。 - 工具 :
gzip、bzip2、xz等。它们分别生成.gz、.bz2、.xz后缀的文件。 - 类比 :对这个封口的“文件夹”(即
.tar文件)进行真空压缩,让它体积变小。
为什么先打包再压缩? 因为压缩算法针对单个大文件的压缩效率,远高于对无数个小文件分别压缩后再管理。 tar 将零散的文件树变成一个连续的字节流,为压缩器提供了最佳的工作原料。
因此,常见的 .tar.gz 文件,其诞生过程是:
-
tar命令将一堆文件打包成一个archive.tar。 -
gzip命令将archive.tar压缩成archive.tar.gz。
而 tar 命令通过内置的 -z 、 -j 、 -J 等选项,自动化地调用了 gzip 、 bzip2 、 xz 这些压缩工具,让我们可以“一条龙”完成打包并压缩的操作。理解这一点,是驾驭 tar 命令的基石。
2. tar 命令语法与核心选项解析
tar 命令的通用语法格式为:
tar [选项...] [归档文件] [要归档的文件或目录...]
它的选项功能庞杂,但我们可以将其分为几类来记忆。首先, 你必须指定一个“主操作模式” ,这是命令的“动词”。
2.1 主操作模式(必须指定一个)
| 选项 | 全称 | 含义 | 助记 |
|---|---|---|---|
-c |
--create |
创建 一个新的归档文件。 | C reate |
-x |
--extract |
从归档文件中 解压 (提取)文件。 | e X tract |
-t |
--list |
列出 归档文件的内容,不解压。 | Lis t |
-r |
--append |
向已存在的归档文件 追加 文件。 | R append |
-u |
--update |
仅追加比归档内版本 更新 的文件。 | U pdate |
关键点 : -c 、 -x 、 -t 是最常用的三个,且它们互斥(不能同时使用)。


452

被折叠的 条评论
为什么被折叠?



