Linux文件归档工具tar
tar 命令是 Linux/Unix 系统中最常用的文件归档工具,用于将多个文件或目录打包成一个单独的归档文件(通常称为“tar 包”),方便传输、备份或存储。它本身不具备压缩功能,但可以与 gzip、bzip2、xz 等压缩工具结合,实现“打包+压缩”的效果。
一、tar 命令的基本语法
tar 命令的核心语法结构如下:
tar [选项] [归档文件名] [源文件/目录...]
- 选项:控制 tar 的行为(如创建、提取、查看归档等);
- 归档文件名:指定生成的 tar 包名称(通常以
.tar
为后缀,若结合压缩则加相应后缀,如.tar.gz
); - 源文件/目录:需要打包的文件或目录(提取时无需指定,只需指定归档文件)。
二、核心选项(必知必会)
tar 的选项非常多,以下是最常用的核心选项(可组合使用):
选项 | 英文含义 | 功能说明 |
---|---|---|
-c | create | 创建新的归档文件(打包)。 |
-x | extract | 从归档文件中提取文件/目录。 |
-t | list | 查看归档文件中的内容(不解压)。 |
-f | file | 指定归档文件的名称(必须放在选项的最后,后面直接跟文件名)。 |
-v | verbose | 显示详细操作过程(列出处理的文件/目录,推荐加上,方便确认)。 |
-z | gzip | 结合 gzip 压缩/解压(归档文件通常以 .tar.gz 或 .tgz 为后缀)。 |
-j | bzip2 | 结合 bzip2 压缩/解压(归档文件通常以 .tar.bz2 为后缀)。 |
-J | xz | 结合 xz 压缩/解压(归档文件通常以 .tar.xz 为后缀,压缩率更高,速度较慢)。 |
-C | directory | 提取文件时指定目标目录(默认解压到当前目录)。 |
-P | absolute-names | 保留文件的绝对路径(默认会去掉路径开头的 / ,避免覆盖系统文件)。 |
-p | preserve-permissions | 提取文件时保留原文件的权限(默认可能会根据当前用户权限调整)。 |
--exclude | exclude | 打包时排除指定的文件/目录(支持通配符 * )。 |
三、常用场景与示例
1. 仅打包(不压缩,生成 .tar
文件)
-
创建 tar 包(将
file1.txt
、dir1
打包为archive.tar
):tar -cvf archive.tar file1.txt dir1/
- 选项解析:
-c
(创建)、-v
(详细)、-f
(指定文件archive.tar
)。 - 执行后会显示打包的文件列表(因
-v
选项)。
- 选项解析:
-
查看 tar 包内容(不解压,确认里面有哪些文件):
tar -tvf archive.tar
- 输出会显示文件权限、大小、修改时间等信息。
-
提取 tar 包(解压到当前目录):
tar -xvf archive.tar
-
提取到指定目录(如解压到
./target_dir
,需确保目录存在):tar -xvf archive.tar -C ./target_dir
2. 打包并压缩(结合不同压缩工具)
tar 常与压缩工具结合,生成更小的归档文件,常见组合如下:
压缩方式 | 选项 | 归档文件后缀 | 特点(压缩率:xz > bzip2 > gzip;速度:gzip > bzip2 > xz) |
---|---|---|---|
gzip | -z | .tar.gz 或 .tgz | 最常用,平衡压缩率和速度 |
bzip2 | -j | .tar.bz2 | 压缩率略高于 gzip,速度稍慢 |
xz | -J | .tar.xz | 压缩率最高,速度最慢(适合归档大文件) |
示例:
-
创建 gzip 压缩包(将
docs/
打包为docs.tar.gz
):tar -czvf docs.tar.gz docs/
-
解压 gzip 压缩包:
tar -xzvf docs.tar.gz # 解压到当前目录 tar -xzvf docs.tar.gz -C ./backup # 解压到 ./backup 目录
-
创建 xz 压缩包(压缩率更高,适合大文件):
tar -cJvf large_files.tar.xz video.mp4 data/
-
查看 bzip2 压缩包内容:
tar -tjvf logs.tar.bz2
3. 高级用法
-
打包时排除指定文件/目录:
例如,打包project/
但排除临时文件project/tmp/
和.log
后缀文件:tar -czvf project.tar.gz --exclude=project/tmp --exclude=*.log project/
-
保留绝对路径打包/解压:
默认情况下,tar 会去掉文件路径开头的/
(避免解压时覆盖系统文件)。若需保留绝对路径,需加-P
选项:# 打包绝对路径文件(如 /etc/nginx/) tar -czvPf nginx_conf.tar.gz /etc/nginx/# 解压时保留绝对路径(会直接解压到 /etc/nginx/,谨慎使用!) tar -xzvPf nginx_conf.tar.gz
-
仅提取 tar 包中的特定文件:
例如,从archive.tar
中只提取file1.txt
和dir1/subfile.txt
:tar -xvf archive.tar file1.txt dir1/subfile.txt
-
增量备份(仅打包修改过的文件):
结合--newer
选项,只打包指定时间后修改的文件(如 2025-08-01 之后):tar -czvf backup_20250801.tar.gz --newer "2025-08-01" /home/user/
四、常见错误与注意事项
-
忘记
-f
选项或位置错误:
-f
必须放在选项最后,且后面直接跟文件名。例如,tar -cvfz archive.tar.gz dir/
是错误的(z
后面不是文件名),正确应为tar -czvf archive.tar.gz dir/
。 -
压缩选项与文件后缀不匹配:
例如,用-z
解压.tar.bz2
文件会失败,需对应使用-j
选项。 -
权限问题:
提取系统目录的 tar 包时(如/etc
),需用sudo
权限,否则可能因权限不足导致部分文件无法提取。 -
大型归档文件处理:
对于几个 GB 以上的 tar 包,建议加-v
选项观察进度,避免误以为命令卡住。
五、总结:常用命令速记
功能 | 命令示例 |
---|---|
创建 gzip 压缩包 | tar -czvf 包名.tar.gz 源文件/目录 |
解压 gzip 压缩包 | tar -xzvf 包名.tar.gz |
创建 bzip2 压缩包 | tar -cjvf 包名.tar.bz2 源文件/目录 |
解压 bzip2 压缩包 | tar -xjvf 包名.tar.bz2 |
查看压缩包内容 | tar -tzf 包名.tar.gz (gzip 格式) |
解压到指定目录 | tar -xzvf 包名.tar.gz -C 目标目录 |
打包时排除文件 | tar -czvf 包名.tar.gz --exclude=排除项 源 |
掌握这些用法,基本可以应对 Linux 系统中绝大多数文件归档和备份场景。