tar

义项:Linux系统命令
tar

tar 是类 Unix 系统中用于把多个文件与目录合并为单个归档文件的命令行工具,名称来自英文 tape archiver(磁带归档器),归档结果通常称为 tarball。它本身只负责打包,并可保留目录结构、权限、属主与时间等元数据,压缩一般交给 gzip、bzip2、xz 等外部程序完成[1]。tar 的归档格式已被 POSIX 标准化,是源码分发与系统备份中长期使用的格式之一[2]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

tar 是 Unix 及类 Unix 系统上的归档(archive)程序,作用是把若干文件与整个目录层次写进一个归档文件,或对已有归档进行列举、解出、追加、删除、比较等操作[3]。它处理的归档既可以是一个普通文件,也可以是磁带机一类的设备,名称即由此而来[4]。

命令的基本形式为 tar 选项 归档名 文件名,其中表示操作模式的主选项通常写在最前面,其余选项改变执行方式,文件名或成员名指定作用对象[3]。在 GNU 实现中,选项可以采用传统风格(字母连写)、短选项风格(每个字母前加单横线)与长选项风格(两个横线加助记名)三种写法[4]。

原理

tar 的归档文件是一个线性拼接的字节流:每个成员前面有一段 512 字节的文件头,记录名称、模式、属主与属组 ID、大小、修改时间、校验和、类型标志与链接名等元数据,随后是该文件的内容,长度补零到 512 字节的整数倍,归档以连续的零块收尾[5]。由于磁带只能按块顺序读写,归档格式被设计为顺序访问,解出某个成员往往需要从开头向后扫描[6]。

文件头中的数值字段采用八进制 ASCII 表示以保证跨机器可移植,例如修改时间记为自 1970 年 1 月 1 日 00:00 协调世界时起的秒数,校验和则是把头部各字节求和、计算时该字段视作空格[5]。tar 格式并不区分文本与二进制内容,文件数据原样写入、不作转换[5]。为提高写入效率,数据按记录输出,一条记录默认由 20 个 512 字节块组成,即 10 KiB[1]。

由于历史原因,tar 存在多种归档格式,原理相同但细节互不兼容,包括 gnu、oldgnu、v7、ustar、star 与 posix 等[7]。v7 格式把文件名限制在 100 字节、文件大小限制在 8 GiB 以内、UID 与 GID 小于 2^21;ustar 由 POSIX.1-1988 定义,允许 255 字节的文件名并保存符号属主信息;posix 格式的限制最少,但部分旧实现无法正确处理[7]。

发展历程

tar 命令行工具于 1979 年 1 月随 Version 7 Unix 出现,取代了更早的 tp 程序,最初的用途是把数据写到没有自身文件系统的顺序 I/O 设备上[1]。此后归档头部的定义在 POSIX.1-1988 中标准化,并在 POSIX.1-2001 中进一步扩展;POSIX.1-2001 转向 pax 命令,tar 命令被列为准备撤销,但在实践中仍被广泛使用[1]。

1988 年的 POSIX 标准引入了 UStar 格式,多数现代 tar 程序都以它读写归档;1997 年 Sun 提出为 tar 增加扩展的方法,该方案后来被 POSIX.1-2001 采纳为 pax 格式,2001 年 star 成为第一个支持该格式的实现,GNU tar 则在 2004 年跟进,但长期未将其作为默认输出格式[8]。常用的 GNU tar 由自由软件基金会维护,其手册同时以 Texinfo 文档与 man 手册形式发布,手册被视为权威说明[9]。

BSD 版 tar 已被纳入 Microsoft Windows,自 Windows 10 的 2018 年 4 月更新起随系统提供,tar 命令也被移植到 IBM i 操作系统[1]。

应用

最常见的使用方式是把目录打包,例如 tar -cvf etc.tar /etc 会把 /etc 下的内容写入归档并逐条列出,若给出目录名,tar 默认递归处理其下所有文件与子目录[4]。与压缩程序配合时可用单一命令完成打包与压缩,-z 调用 gzip、-j 调用 bzip2、-J 调用 xz、-Z 调用 compress,解包时使用对应选项即可[10]。GNU tar 还提供 -a 选项,按归档文件的扩展名自动选择压缩程序[6]。

压缩后的归档通常在 .tar 之后叠加压缩器后缀,如 .tar.gz、.tar.bz2、.tar.xz,相应地也有 .tgz、.tbz2、.txz 等短后缀写法。tar 能保留权限、属主与属组、符号链接和特殊文件,因此软件源码与目录树常以压缩 tar 包形式分发[11]。

系统管理中也常用 tar 完成目录迁移与备份:把归档写到标准输出、再由另一端从标准输入解出,可以在不使用额外工具的情况下复制整棵目录树[12]。增量与多卷选项面向备份场景,--listed-incremental 借助快照文件记录状态以生成增量归档,--multi-volume 则支持把归档分散到多卷介质[13]。

局限

tar 自身不提供数据压缩,压缩需要调用 gzip、bzip2、xz 等外部程序,因此单独得到的 .tar 文件体积与原始文件之和相近[11]。压缩后的归档不能再执行追加、删除等修改操作,--delete 对压缩归档无效,需先解压再处理[13]。

归档格式的顺序结构带来性能代价:只解出靠后的成员也需要从头遍历整个文件,部分解包速度较慢[14]。不同格式之间的兼容性同样有限,gnu 格式对稀疏文件与增量归档的实现方式与其他格式不兼容,posix 格式虽最灵活,一些较旧的 tar 实现却无法正确读取[7]。

字段宽度也构成限制:v7 以 12 字节存放文件大小,只能容纳 11 位八进制数字,对应 8 GiB 上限,超出需依赖 GNU 等实现把大小改为二进制编码的扩展[14]。此外,若归档中的文件直接解到当前目录而不套一层同名目录,文件会散落到所在目录并可能覆盖同名文件,这类归档被俗称为 tarbomb[8]。

参见

  • gzip —— 常与 tar 配合使用的压缩程序,对应归档后缀 .tar.gz。

  • bzip2 —— tar 通过 -j 选项调用的压缩程序,输出 .tar.bz2 归档。

  • xz —— 压缩率较高、由 -J 选项调用的压缩程序,输出 .tar.xz 归档。

  • POSIX —— 定义 ustar 与 pax 等 tar 归档格式标准的规范体系。

  • pax —— POSIX.1-2001 中取代 tar 命令的归档工具,支持 pax 交换格式。

  • ZIP —— 另一种常见的归档与压缩一体化的文件格式。

参考资料

  1. epfl.ch 上的网页 [引用日期2026-10-29]
  2. [科普中国]-Tar [引用日期2026-10-29]
  3. Synopsis [引用日期2026-10-29]
  4. tar(1) — manpages-pl — Debian unstable - other versions [引用日期2026-10-29]
  5. Basic Tar Format [引用日期2026-10-29]
  6. tar (computing) [引用日期2026-10-29]
  7. 8 Controlling the Archive Format [引用日期2026-10-29]
  8. Tarbomb [引用日期2026-10-29]
  9. help [引用日期2026-10-29]
  10. Archive and compress data using Linux [引用日期2026-10-29]
  11. epfl.ch 上的网页 [引用日期2026-10-29]
  12. file [引用日期2026-10-29]
  13. Ubuntu Manpage: tar - tar_1.30+dfsg-7ubuntu0.20.04.4_amd64 [引用日期2026-10-29]
  14. Tar_(file_format) [引用日期2026-10-29]
词条评价
词条统计

浏览次数:3 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:53:09Z

历史版本

本条目引用的词条
gzip bzip2 xz POSIX pax ZIP