跳转到内容

tar

tar(Tape Archive)是 Linux 系统中用于文件归档(打包)和压缩的经典工具,可将多个文件或目录合并成一个归档文件,并支持与 gzip、bzip2、xz 等压缩算法结合生成压缩包。

Terminal window
tar 操作选项 [压缩选项] [辅助选项...] -f 归档名.tar [文件/目录...]
  • 操作选项:决定 tar 做什么(创建、解包、列出…),是必选选项
  • 压缩选项:决定是否启用 gzip、bzip2、xz 等压缩
  • 辅助选项:控制 tar 行为
  • 文件名/目录:对于归档操作,用于指出需要归档的文件/目录;对于提取操作,用于指出需要提取的文件/目录,如果不指定默认提取全部

-f 后面必须紧跟归档文件名,且放在所有选项的最后

1. 操作选项(必选其一)

选项 说明
-c 创建新的归档文件(打包)
-x 从归档文件中提取文件(解压)
-t 列出归档文件中的内容(查看)
-r 向已有的归档文件中添加新文件(只能对未压缩的 .tar 用)
-A 向已有归档里追加另一个归档(只能对未压缩的 .tar 用)
-d 比较归档文件与实际文件的差异

2. 压缩选项

选项 说明
-z 通过 gzip 压缩/解压,对应文件扩展名 .tar.gz 或 .tgz
-j 通过 bzip2 压缩/解压,对应文件扩展名 .tar.bz2 或 .tbz
-J 通过 xz 压缩/解压,对应文件扩展名 .tar.xz
-I <压缩程序> 调用系统中安装的其他压缩工具来处理归档文件的压缩和解压

3. 辅助选项

选项 说明
-f <filename> 指定归档文件名,必须紧跟文件名
-C <dir> 切换目录,提取或打包时先切换到指定目录再处理,用法很多,见示例
-v 显示详细过程,列出处理的每个文件
-w 在每次操作前询问用户确认
-p 保留文件权限,提取时恢复原文件的权限和属性
-k 保留原文件,提取时不覆盖已存在的文件
--exclude=<GLOB> 排除文件/目录,不将匹配 GLOB 的文件加入归档
--exclude-from=FILE 从列表文件读取排除规则
--progress 显示进度条(与 -v 一起使用)

1. 创建归档文件

Terminal window
# 将文件 file1、file2 和目录 directory 打包到 archive.tar
tar -cvf archive.tar file1 file2 directory/

2. 提取归档文件

Terminal window
# 提取 archive.tar 中的文件和目录到当前目录
tar -xvf archive.tar
# 只解压归档中的特定文件(如从 backup.tar 中提取 passwd 文件)
tar -xvf backup.tar etc/passwd

3. 创建压缩归档文件

Terminal window
# 将 directory 打包并使用 gzip 压缩,生成 archive.tar.gz
tar -czvf archive.tar.gz directory

4. 解压压缩归档文件

Terminal window
# 解压 archive.tar.gz,在当前目录下恢复其中的文件和目录
tar -zxvf archive.tar.gz

5. 查看归档/压缩包内容

Terminal window
# 查看 archive.tar 中的文件列表
tar -tvf archive.tar
# 查看压缩包 data.tar.gz 中的内容(无需指定压缩选项,tar 会自动识别)
tar -tvf data.tar.gz

在提取文件时,tar 通常能自动识别压缩格式(gzip、xz、bzip2 等),对于上述示例,加上 -z(gzip)会更明确。

6. 追加文件到已归档文件

Terminal window
# 向已有的归档文件(非压缩)中添加新文件 newfile.txt
tar -rvf archive.tar newfile.txt

7. 比较归档文件和实际文件差异

Terminal window
# 比较归档文件与实际文件的差异(哪些文件被修改过)
tar -dvf archive.tar

8. -C 选项的几种用法

(1) 解压到指定目录(最常用)

默认情况下,tar 会将文件解压到当前目录。使用 -C 可以指定解压目标路径:

Terminal window
# 将 archive.tar.gz 解压到 /tmp/extract 目录
tar -zxvf archive.tar.gz -C /tmp/extract

(2) 打包时忽略上级路径(避免冗余目录)

如果直接打包绝对路径或深层目录,归档中会包含完整路径。使用 -C 可以简化归档内的路径结构。假设有目录结构:

Terminal window
/home/user/project/dist/

把 dist 下的内容打包成 site.tgz,如果直接:

Terminal window
tar -czvf site.tgz /home/user/project/dist

归档内部会是:

home/user/project/dist/file1.html
home/user/project/dist/file2.js

如果进行解包,会在当前目录下生成完整的目录层级。使用 -C 去掉上级路径:

Terminal window
# 先用 -C 切换目录到 /home/user/project/dist
# 再用 . 表示打包当前目录下的所有内容
tar -czvf site.tgz -C /home/user/project/dist .

归档内部会是:

./file1.html
./file2.js

这时提取文件就不会出现冗余的目录。

(3) 多目录打包

使用多次 -C 可以从不同路径收集文件,同时控制归档层级:

Terminal window
# 把 /home/user/project/dist/ 和 /var/log 下的 syslog 打包进同一个包
tar -czvf project.tgz \
-C /home/user/project/dist . \
-C /var/log syslog

归档内部结构:

./file1.html
./file2.js
./syslog