在 Linux 中创建 tar.gz 文件:tar 命令语法、目录归档与排除技巧

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.gzzip 有何区别?.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 命令指南。