
tar 归档文件存储一组文件及其元数据(如所有者、权限和时间戳)。当使用 gzip 压缩时,归档文件使用 .tar.gz 或 .tgz 扩展名。
本文通过实际示例讲解如何使用 tar 命令创建 .tar.gz 文件。
速查参考
如需可打印的速查表,请参阅 tar 速查表。
| 任务 | 命令 |
|---|---|
| 从文件创建 | tar -czf archive.tar.gz file1 file2 |
| 从目录创建 | tar -czf archive.tar.gz /path/to/dir/ |
| 不含父路径归档 | tar -czf archive.tar.gz -C /path/to/parent dirname |
| 创建 .tgz 文件 | tar -czf archive.tgz file1 file2 |
| 带详细输出创建 | tar -czvf archive.tar.gz file1 file2 |
| 按通配符匹配创建 | tar -czf images.tar.gz *.jpg |
| 排除文件或目录 | tar -czf archive.tar.gz --exclude=dir /path/ |
| 在指定位置创建 | tar -czf /backup/archive.tar.gz /path/to/dir/ |
| 列出归档内容 | tar -tzf archive.tar.gz |
语法
创建 .tar.gz 文件的通用语法如下:
tar -czf archive-name.tar.gz file-or-directory...
以下是各选项的作用:
-c- 创建新归档。-z- 使用 gzip 压缩归档。-f archive-name.tar.gz- 指定归档文件名。file-or-directory...- 要加入归档的文件和目录的空格分隔列表。
运行命令的用户必须对要归档的文件具有读取权限,并对将要创建归档的目录具有写入权限。
创建 tar.gz 文件
要从两个文件创建归档,运行:
tar -czf archive.tar.gz file1 file2
命令执行成功后不会输出任何内容。要确认归档已创建,可使用 ls 列出目录内容:
ls -lh archive.tar.gz
要在特定目录中创建归档,请提供归档文件的完整路径:
tar -czf /home/user/archive.tar.gz file1 file2
要在添加每个文件时看到其名称,可加上 -v(verbose,详细)标志:
tar -czvf archive.tar.gz file1 file2
file1
file2
归档目录
要根据目录内容创建 .tar.gz 归档,请将目录路径作为源传入:
tar -czf web_backup.tar.gz /var/www/website
要确认归档中包含了哪些内容,可使用 --list(-t)选项列出其内容:
tar -tzf web_backup.tar.gz
var/www/website/
var/www/website/index.html
var/www/website/css/style.css
默认情况下,tar 会递归归档目录。添加 --no-recursion 仅存储目录条目本身,这在使用 find 自行构建文件列表并将其传给 tar 时很有用。
要使用通配符归档当前目录中的所有 .jpg 文件:
tar -czf images.tar.gz *.jpg
归档路径与前导斜杠
注意,上面列表中的路径以 var/ 开头,而不是 /var/。当源为绝对路径时,tar 会去掉前导斜杠并打印警告:
tar: Removing leading '/' from member names
归档仍会创建。该警告表示每个成员都存储在完整的相对路径下,因此解压归档时会重建整个 var/www/website 目录树,而非仅该文件夹本身。
要在不包含父路径的情况下归档该文件夹,可使用 --directory(-C)选项切换到父目录,并只传入文件夹名称:
tar -czf web_backup.tar.gz -C /var/www website
此时成员路径以 website/ 开头,因此解压归档时会将该文件夹释放到你解包的任何位置。
创建 .tgz 文件
.tgz 文件是同一格式的另一个较短名称,保留它是为了兼容那些限制文件扩展名长度的系统。由于 tar 从 -f 选项读取归档名称,因此无需额外标志:
tar -czf archive.tgz file1 file2
本指南中的每条命令,无论输出命名为 .tar.gz 还是 .tgz,效果都一样。
排除文件与目录
使用 --exclude 可将特定文件或目录排除在归档之外。提供的路径应相对于源路径:
tar -czf archive.tar.gz --exclude=node_modules --exclude='.git' /var/www/website
要排除多个模式,可对每一项重复使用 --exclude。你也可以使用通配符:
tar -czf archive.tar.gz --exclude='*.log' /var/www/website
故障排查
tar: file: Cannot stat: No such file or directory(无法 stat:没有那个文件或目录)——一个或多个源路径不正确或不存在。运行 tar 前可用 ls -l 逐个核实路径。
tar: archive.tar.gz: Cannot open: Permission denied(权限被拒绝)——你在目标目录中没有写入权限。请将归档保存到可写位置,或以相应权限运行命令。
通配符不包含隐藏文件:Shell 通配符(如 *.jpg)不会匹配以 . 开头的文件。如果需要隐藏文件,应直接归档目录本身,而不要仅依赖通配符。
归档比预期更大:你可能包含了不必要的目录,如 node_modules、.git、日志或缓存文件。为这些路径添加 --exclude 模式即可。
常见问题
如何解压 tar.gz 文件?使用 tar -xzf archive.tar.gz。要解压到特定目录,加上 -C /path/to/dir。完整细节请参阅解压 tar.gz 指南。
.tar.gz 与 .tar.bz2 有何区别?两者都是压缩的 tar 归档,但使用不同的压缩算法。gzip(.tar.gz)速度更快;bzip2(.tar.bz2)通常生成更小的文件但速度更慢。在大多数场景下,.tar.gz 是标准选择。bzip2 对应的解压方法请参阅如何解压 .tar.bz2 文件。
tar.gz 与 zip 有何区别?.tar.gz 是单一归档,会存储文件元数据(权限、所有者、时间戳);.zip 则逐个压缩文件。在 Linux 上,tar.gz 是源码分发与备份的标准格式。zip 对应的创建方法请参阅如何创建 zip 文件。
我的 tar 版本不支持 -z 标志,怎么办?较旧的 tar 版本可能没有内置 gzip 支持。此时可将原始归档通过管道传给 gzip 命令:
tar -cf - file1 file2 | gzip > archive.tar.gz
这会在标准输出(-)上生成未压缩归档,并通过管道传给 gzip,由 gzip 将压缩结果写入磁盘。
总结
在 Linux 中创建 .tar.gz 文件,可使用 tar -czf archive.tar.gz,后接要归档的文件或目录。加上 -v 查看详细输出,用 --exclude 跳过特定文件或目录。
有关 tar 选项的完整参考(含解压部分),请参阅 tar 命令指南。