tar
tar(Tape Archive)是 Linux 系统中用于文件归档(打包)和压缩的经典工具,可将多个文件或目录合并成一个归档文件,并支持与 gzip、bzip2、xz 等压缩算法结合生成压缩包。
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. 创建归档文件
# 将文件 file1、file2 和目录 directory 打包到 archive.tartar -cvf archive.tar file1 file2 directory/2. 提取归档文件
# 提取 archive.tar 中的文件和目录到当前目录tar -xvf archive.tar
# 只解压归档中的特定文件(如从 backup.tar 中提取 passwd 文件)tar -xvf backup.tar etc/passwd3. 创建压缩归档文件
# 将 directory 打包并使用 gzip 压缩,生成 archive.tar.gztar -czvf archive.tar.gz directory4. 解压压缩归档文件
# 解压 archive.tar.gz,在当前目录下恢复其中的文件和目录tar -zxvf archive.tar.gz5. 查看归档/压缩包内容
# 查看 archive.tar 中的文件列表tar -tvf archive.tar
# 查看压缩包 data.tar.gz 中的内容(无需指定压缩选项,tar 会自动识别)tar -tvf data.tar.gz在提取文件时,tar 通常能自动识别压缩格式(gzip、xz、bzip2 等),对于上述示例,加上
-z(gzip)会更明确。
6. 追加文件到已归档文件
# 向已有的归档文件(非压缩)中添加新文件 newfile.txttar -rvf archive.tar newfile.txt7. 比较归档文件和实际文件差异
# 比较归档文件与实际文件的差异(哪些文件被修改过)tar -dvf archive.tar8. -C 选项的几种用法
(1) 解压到指定目录(最常用)
默认情况下,tar 会将文件解压到当前目录。使用 -C 可以指定解压目标路径:
# 将 archive.tar.gz 解压到 /tmp/extract 目录tar -zxvf archive.tar.gz -C /tmp/extract(2) 打包时忽略上级路径(避免冗余目录)
如果直接打包绝对路径或深层目录,归档中会包含完整路径。使用 -C 可以简化归档内的路径结构。假设有目录结构:
/home/user/project/dist/把 dist 下的内容打包成 site.tgz,如果直接:
tar -czvf site.tgz /home/user/project/dist归档内部会是:
home/user/project/dist/file1.htmlhome/user/project/dist/file2.js如果进行解包,会在当前目录下生成完整的目录层级。使用 -C 去掉上级路径:
# 先用 -C 切换目录到 /home/user/project/dist# 再用 . 表示打包当前目录下的所有内容tar -czvf site.tgz -C /home/user/project/dist .归档内部会是:
./file1.html./file2.js这时提取文件就不会出现冗余的目录。
(3) 多目录打包
使用多次 -C 可以从不同路径收集文件,同时控制归档层级:
# 把 /home/user/project/dist/ 和 /var/log 下的 syslog 打包进同一个包tar -czvf project.tgz \ -C /home/user/project/dist . \ -C /var/log syslog归档内部结构:
./file1.html./file2.js./syslogman tar- GNU tar 官方文档