首页/系统/Linux 运维命令速查/tar 追加与更新包内文件
文件与目录76 条

tar 追加与更新包内文件

向已有 tar 包追加或更新文件(-r/-u),以及合并两个包(-A);仅支持未压缩 tar。

Linux 运维命令速查系统更新于 2026-10-13

tar 追加是什么

GNU tar 的 -r、-u、-A 是在已有归档上做增补的三种模式:-r 把文件或目录直接追加到包尾,-u 只在文件比包内同名成员更新时才写入,-A 把另一个 tar 包整体接进来。它们都要求目标是未压缩的 .tar,因为压缩流一旦生成就无法在中间插入数据。适合每日往同一个包补日志、把分段备份合并成一个大包这类场景。

基本信息

适用平台GNU tar(CentOS/Ubuntu 自带);BSD tar(macOS)支持 -r 与 -A
语法tar -rf 包 文件 / tar -uf 包 文件 / tar -Af 包1 包2
权限要求对目标 tar 文件有写权限
硬性限制仅未压缩 .tar,压缩包必须先解开或整体重建

典型使用场景

  • 每日把新日志追加进同一个归档,避免全量重打一遍
  • 备份窗口内把若干分段包合并成一个完整包,便于异地归档
  • 只把发生过变化的文件补进包,由 -u 依据 mtime 判断
  • 临时往历史包里补几个配置文件后交付出去
  • 现成包漏了文件时不必解包重压,直接追加

常用示例

常用示例
tar -rf data.tar newfile.log        # 追加单个文件到包尾
tar -rf data.tar dir2/              # 追加整个目录(内容进包)
tar -uf data.tar changed.log        # 仅当它比包内成员新才追加
tar -rf data.tar --exclude='*.tmp' dir2/   # 追加时排除临时文件
tar -tf data.tar | tail -5          # 列出成员,确认追加结果
tar -Af part1.tar part2.tar         # 把 part2 整体接到 part1 尾部
tar -tvf data.tar | head            # 带权限与时间戳复核内容

-r/-u/-A 对照

操作含义注意
-r无条件追加文件或目录到包尾包内已有同名成员不会覆盖,会出现两份
-u仅当文件 mtime 更新时追加不删除包内旧副本,解包时后者覆盖前者
-A把另一个 tar 包拼接进来两侧都必须是未压缩 tar
压缩包想做同样的事:先 gunzip 解出 .tar 再操作重压,或干脆 tar -cf 重建一个包。长期维护的包建议定期重建,重建能顺带丢掉历史残留的旧成员。
-u 的语义是「追加更新过的文件」,不是「同步」:包内被删除的文件不会消失,同名旧版本也还在,别把它当成增量备份的完整性保证。

易错点

  • 对 .tar.gz 执行 -r:tar 会报无法更新压缩归档或写出损坏包,动手前先用 file 确认是否未压缩
  • -u 只追加不删除,包内旧版本仍在,解包结果与预期的「最新状态」可能不一致
  • 反复往同一个包追加同名文件会让包体持续膨胀,长期维护的包应定期重建
  • 包在传输中断后结构不完整,再 -r 会报 unexpected EOF,须先修复或重建

数据来源与参考

  • man 1 tar(GNU tar 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌