tar本身不支持直接合并两个已存在的tar归档文件,可靠做法是先解包再重打包:mkdir tmp && cd tmp && tar -xf ../a.tar && tar -xf ../b.tar && tar -cf ../merged.tar .。

tar 本身不支持直接合并两个已存在的 tar 归档文件(比如 a.tar 和 b.tar)为一个新 tar 文件,因为 tar 是顺序写入的归档格式,没有“追加到中间”或“拼接元数据”的机制。但你可以通过提取再重新打包的方式实现逻辑上的合并。
方法一:解包再重打包(推荐,最可靠)
这是最通用、兼容性最好、不会破坏权限/时间戳(配合正确选项)的方法:
- 新建一个临时目录,避免污染当前工作区:
mkdir /tmp/merge-tmp && cd /tmp/merge-tmp - 分别解压两个 tar 文件:
tar -xf /path/to/a.tar和tar -xf /path/to/b.tar - 重新打包全部内容:
tar -cf ../merged.tar .(注意路径,避免把../merged.tar也打进自身) - 清理临时目录:
cd .. && rm -rf /tmp/merge-tmp
如需保留原始权限、所有者、时间戳等,全程使用 -p(preserve permissions)和 --numeric-owner(避免用户名解析问题),例如:tar -xpf a.tar、tar -cpf ../merged.tar .。
方法二:用 -r 追加(仅限未压缩的 tar,且有局限)
tar -r 可以将文件追加到已有 tar 归档末尾,但它不能追加另一个 tar 文件的内容,只能追加单个文件或目录。所以不能直接 tar -rf a.tar b.tar —— 这会把整个 b.tar 文件作为一条记录加进去,而不是展开它。
若硬要使用 -r,需先解包 b.tar 到当前目录,再逐个追加:
tar -xf b.tar<br>tar -rf a.tar *
⚠️ 注意:
-r 不支持 gzip/bzip2/xz 压缩归档(即不能对 .tar.gz 使用),且无法修改已有条目的元数据,也不适合大文件场景(tar 会重写整个归档)。方法三:流式合并(节省磁盘空间,适合大文件)
不用解压到磁盘,而是用管道流式处理:
-
cat a.tar b.tar > merged.tar—— ❌ 错误!这只会拼接二进制,tar 读取时会在第一个归档结尾处遇到 EOF,后续内容被忽略或报错 - ✅ 正确做法是解包流 + 重打包流:
tar -O -f a.tar | tar -cf - -T - | tar -Af - b.tar > /dev/null<br>tar -Af merged.tar b.tar
—— 仍不成立 - 实际可行的流式方案:
(tar -O -f a.tar; tar -O -f b.tar) | tar -cf merged.tar --format=gnu -T -
但需确保两个源 tar 都不含绝对路径、无损坏,且目标 tar 支持 GNU 格式;更稳妥的是:tar -O -f a.tar | tar -cf - --files-from=/dev/stdin | tar -Af merged.tar -<br>tar -O -f b.tar | tar -cf - --files-from=/dev/stdin | tar -Af merged.tar -
—— 实际中不如方法一清晰可控,一般只在内存/磁盘受限时考虑。
注意事项与避坑提醒
• 同名文件会被后解压的覆盖(方法一中 b.tar 里的同名文件会覆盖 a.tar 的)
• 若需去重或控制覆盖逻辑,应在解包前用 tar -tf 查看内容,或结合 rsync --ignore-existing 等工具预处理
• .tar.gz / .tar.xz 等压缩包必须先解压(gunzip, xz -d)才能用 -r 或参与流式操作
• 不建议用 cp 或 cat 直接拼接 tar 文件,会导致归档结构损坏,tar -tf 将只列出第一个归档的内容











