Answers:
虽然tar
可以将文件添加到现有的存档中,但无法对其进行压缩。您将不得不bunzip2
压缩压缩文件,保留标准的tarball。然后,您可以使用tar
的功能将文件添加到现有档案,然后使用进行重新压缩bzip2
。
从手册中:
-r Like -c, but new entries are appended to the archive. Note that this only
works on uncompressed archives stored in regular files. The -f option is
required.
另一个答案是正确的:如果不解压缩tar存档,就无法正确更新它。GNU tar文档对此进行了提示,并且尝试更新失败并显示了明确的错误消息:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
但是,如果您对不需要减压的肮脏的工作方式解决方案感兴趣,我可以根据以下发现提供一种解决方案:
cat
支持使用附加bzip2流,并生成有效的bzip2流(gzip也是如此);cat
tar不会产生有效的tar文件,这就是该--concatenate
选项存在的原因,但是我们可以要求tar假装它是有效的:您想要或尝试使用cat来连接两个档案而不是使用该
--concatenate
操作似乎更直观。毕竟,cat是用于合并文件的实用程序。但是,tar归档包含文件结尾标记,如果要将串联的归档作为一个归档正确读取,则必须将其删除。
--concatenate
在附加每个新存档之前,从目标存档中删除存档结束标记。如果使用cat合并档案,则结果将不是有效的tar格式档案。如果需要从使用cat实用程序添加到的存档中检索文件,请使用--ignore-zeros
(-i
)选项。
基于此知识,我们可以执行以下操作:
cat {one,two}.tar.bz2 >combined.tar.bz2
如上面的文档摘要所述,此结果将在无效的tar文件中使用--ignore-zeros
,但仍然可以完全读取该文件:
## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b
## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c
## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c
请注意,以上内容如何列出了原始两个归档文件中的所有三个文件,而忽略-i
(正确)仅列出了第一个原始归档文件中的文件:
$ tar tf combined.tar.bz2
a
b
再次,这不过是一个肮脏的把戏,但是如果您同时控制写和读方面,并且可以确保-i
在尝试从以这种方式创建的文件中进行读取时可以使用该方法,那么它可能会很有用。
i
到命令行的人将看到整个内容。