tar
定义
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]。
参见
参考资料
- epfl.ch 上的网页 [引用日期2026-10-29]
- [科普中国]-Tar [引用日期2026-10-29]
- Synopsis [引用日期2026-10-29]
- tar(1) — manpages-pl — Debian unstable - other versions [引用日期2026-10-29]
- Basic Tar Format [引用日期2026-10-29]
- tar (computing) [引用日期2026-10-29]
- 8 Controlling the Archive Format [引用日期2026-10-29]
- Tarbomb [引用日期2026-10-29]
- help [引用日期2026-10-29]
- Archive and compress data using Linux [引用日期2026-10-29]
- epfl.ch 上的网页 [引用日期2026-10-29]
- file [引用日期2026-10-29]
- Ubuntu Manpage: tar - tar_1.30+dfsg-7ubuntu0.20.04.4_amd64 [引用日期2026-10-29]
- Tar_(file_format) [引用日期2026-10-29]