tar 是什么?
tar 的名字来源于 Tape Archiver(磁带归档器),它最初的设计目的是将多个文件和目录合并成一个单一的文件,以便于备份到磁带上。

尽管现在我们很少再用磁带了,但 tar 凭借其简单、高效和跨平台的特性,成为了在 Unix/Linux 系统中打包文件的标准工具。
重要概念:打包 vs. 压缩
- 打包:将多个文件和目录合并成一个文件,这个过程不减少文件大小,只是将它们“捆绑”在一起。
tar主要负责打包。 - 压缩:通过特定的算法(如 gzip, bzip2, xz)来减小文件的大小。
tar本身不压缩,但它可以调用其他压缩工具来完成这个工作。
最常见的用法是 先打包,再压缩,生成一个 .tar.gz 或 .tgz 这样的文件。
基本语法
tar 命令的基本语法如下:

tar [选项] [文件或目录...]
tar 的选项非常独特,通常以一个连字符 开头,并且可以组合在一起,最经典的组合是 czvf。
核心选项详解
理解以下几个核心选项,你就能掌握 tar 80% 的用法。
| 选项 | 长格式 | 含义 | 说明 |
|---|---|---|---|
c |
--create | 创建一个新的归档文件。 | 用于打包。 |
x |
--extract | 解包(提取)归档文件中的内容。 | 用于解包。 |
t |
--list | 列出归档文件中包含的内容。 | 不解包,只查看里面有什么。 |
r |
--append | 追加文件到归档文件的末尾。 | 不常用,因为追加效率不高。 |
u |
--update | 更新归档文件,只追加比归档中更新的文件。 | 不常用。 |
f |
--file=ARCHIVE | 指定归档文件的名称。 | 几乎总是需要这个选项,紧跟在后面的是文件名,-f my_archive.tar。 |
v |
--verbose | 详细模式,在处理文件时,显示正在处理的文件名。 | 可选,但有助于了解进度。 |
z |
--gzip | 使用 gzip 进行压缩/解压。 |
生成/处理 .tar.gz 或 .tgz 文件。 |
j |
--bzip2 | 使用 bzip2 进行压缩/解压。 |
生成/处理 .tar.bz2 文件,压缩率比 gzip 高,但速度慢。 |
J |
--xz | 使用 xz 进行压缩/解压。 |
生成/处理 .tar.xz 文件,压缩率最高,但速度最慢。 |
C |
--directory=DIR | 在指定目录中执行操作。 | -C /tmp 表示在 /tmp 目录下解压文件。 |
常用操作场景
打包并压缩文件 (最常用)
使用 gzip 压缩 (.tar.gz 或 .tgz)
这是最常见的方式,压缩率和速度都比较均衡。

# 将 my_folder 目录打包并压缩为 my_folder.tar.gz # c: 创建, z: gzip压缩, v: 显示过程, f: 指定文件名 tar -czvf my_folder.tar.gz my_folder/ # 将 file1.txt 和 file2.txt 打包压缩为 files.tar.gz tar -czvf files.tar.gz file1.txt file2.txt
使用 bzip2 压缩 (.tar.bz2)
压缩率比 gzip 高,但速度慢一些。
# 将 my_folder 目录打包并压缩为 my_folder.tar.bz2 # j: bzip2压缩 tar -cjvf my_folder.tar.bz2 my_folder/
使用 xz 压缩 (.tar.xz)
压缩率最高,但速度最慢,适合对体积要求极高的场景。
# 将 my_folder 目录打包并压缩为 my_folder.tar.xz # J: xz压缩 (注意是大写J) tar -cJvf my_folder.tar.xz my_folder/
解包并解压文件
解压 .tar.gz 文件
# 解压 my_folder.tar.gz 到当前目录 # x: 解包, z: gzip解压, v: 显示过程, f: 指定文件名 tar -xzvf my_folder.tar.gz # 解压到指定目录 /tmp (需要目录存在) tar -xzvf my_folder.tar.gz -C /tmp
解压 .tar.bz2 文件
# j: bzip2解压 tar -xjvf my_folder.tar.bz2
解压 .tar.xz 文件
# J: xz解压 (注意是大写J) tar -xJvf my_folder.tar.xz
智能解压
现代的 tar 非常智能,你可以省略 z, j, J 选项,它会自动根据文件扩展名选择正确的解压方式。
# 自动识别 .tar.gz 或 .tar.bz2 或 .tar.xz 并解压 tar -xvf my_archive.tar.gz tar -xvf my_archive.tar.bz2 tar -xvf my_archive.tar.xz
查看归档文件内容(不解压)
查看 .tar.gz 文件列表
# t: 列表, z: gzip tar -tzvf my_folder.tar.gz
查看 .tar.bz2 文件列表
# j: bzip2 tar -tjvf my_folder.tar.bz2
查看所有文件(包括子目录)
默认 t 命令只列出顶级文件,加上 -a 或 选项可以递归列出所有内容。
tar -tvf my_folder.tar.gz # 只列出 my_folder/ 下的直接内容 tar -tavf my_folder.tar.gz # 递归列出所有子目录和文件
仅解压特定文件
你可以通过在文件名后指定要解压的文件来提取单个或部分文件。
# 从 my_folder.tar.gz 中只解压 my_folder/config.txt 文件 tar -xzvf my_folder.tar.gz my_folder/config.txt # 如果要解压的文件在子目录中,需要写全路径 tar -xzvf my_folder.tar.gz my_folder/subdir/data.csv
快速参考表
| 任务 | 命令 | 说明 |
|---|---|---|
| 打包并 gzip 压缩 | tar -czvf archive.tar.gz files/ |
最常用的打包压缩命令 |
| 打包并 bzip2 压缩 | tar -cjvf archive.tar.bz2 files/ |
压缩率更高,速度稍慢 |
| 打包并 xz 压缩 | tar -cJvf archive.tar.xz files/ |
压缩率最高,速度最慢 |
| 解压 .tar.gz | tar -xzvf archive.tar.gz |
自动识别并解压 |
| 解压到指定目录 | tar -xzvf archive.tar.gz -C /path/to/dir |
将文件解压到指定目录 |
| 查看 .tar.gz 内容 | tar -tzvf archive.tar.gz |
列出归档包中的文件 |
| 仅解压单个文件 | tar -xzvf archive.tar.gz path/to/inside/file |
从归档包中提取特定文件 |
最佳实践和技巧
-
使用绝对路径或相对路径:在打包时,推荐使用相对路径,这样解压后文件结构会比较干净,不会带有系统上的完整路径。
# 进入要打包的目录的上一级 cd /path/to/parent tar -czvf my_folder.tar.gz my_folder/ # 而不是在 my_folder 内部使用绝对路径 # cd /path/to/parent/my_folder # tar -czvf ../my_folder.tar.gz /path/to/parent/my_folder # 不推荐
-
使用
.tgz作为.tar.gz的简写:.tgz是.tar.gz的一个常见简写,完全等价。tar -czvf my_folder.tgz my_folder/
-
排除文件或目录:如果你想打包一个目录,但想排除其中的某些文件(如临时文件、
.git目录等),可以使用--exclude选项。# 打包 my_folder,但排除 .git 目录 和所有 .tmp 文件 tar -czvf my_project.tar.gz --exclude='.git' --exclude='*.tmp' my_folder/
-
备份整个系统(谨慎使用):
tar常用于制作系统快照。# 注意:这个命令必须在系统外部的 Live CD/USB 环境中运行,或者在系统完全挂载后运行 # --exclude=... 用于排除不需要备份的文件系统,如 /proc, /sys, /dev, /run 等 tar -czvf system_backup.tar.gz --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=mnt --exclude=media --exclude=boot /
tar 是一个功能强大且灵活的工具,记住它的核心逻辑:
create (创建),xtract (提取),tlist (列表) 是三个基本操作。file (文件名) 几乎总是必需的。verbose (详细) 让你看到过程。z(gzip),j(bzip2),J(xz) 负责压缩和解压。
掌握了这些,你就可以在绝大多数场景下熟练地使用 tar 来管理你的文件了。
