在一个命令中连接多个 tar 文件

Jef*_*all 10 linux unix command-line tar

我每天都会收到 4 到 100 个非常大的 tar (~20GB) 存档文件。过去,我一直通过循环遍历我在文件系统上看到的每个档案并执行类似的操作来连接它们

/bin/tar -concatenate --file=allTars.tar receivedTar.tar
Run Code Online (Sandbox Code Playgroud)

然而,问题在于当我连接越来越多的 tar 文件时,它必须读到末尾allTars.tar才能再次开始连接。有时需要 20 多分钟才能开始添加另一个 tar 文件。它太慢了,我错过了商定的完整allTars.tar.

我还尝试将我的 tar 命令交给一个文件列表,如下所示:

/bin/tar --concatenate --file=alltars.tar receiverTar1.tar receivedTar2.tar receivedTar3.tar...etc
Run Code Online (Sandbox Code Playgroud)

这给出了非常奇怪的结果。 allTars.tar将是预期的大小(即接近所有receivedTar.tar文件的大小加在一起)但似乎在allTars.tar解压缩时覆盖文件。

有什么方法可以在一个命令中连接所有这些 tar 文件,或者它不必每次都读取到被连接的存档的末尾,让它们正确解压缩所有文件/数据?

trs*_*trs 12

这个问题已经很老了,但我希望自己能更容易地更快找到以下信息。因此,如果其他人偶然发现了这一点,请享受:

Jeff 上面描述的是 gnu tar 中的一个已知错误(2008 年 8 月报告)。只有第一个存档(-f选项后面的那个)会删除其 EOF 标记。如果您尝试连接 2 个以上的档案,则最后一个档案将“隐藏”在文件结束标记后面。

这是 tar 中的一个错误。它连接整个存档,包括尾随零块,因此默认情况下读取结果存档在第一次连接后停止。

来源:https : //lists.gnu.org/archive/html/bug-tar/2008-08/msg00002.html (以及以下消息)

考虑到这个错误的年龄,我想知道它是否会得到修复。我怀疑是否有一个临界质量受到影响。

避免此错误的最佳方法可能是使用该-i选项,至少对于文件系统上的 .tar 文件。

正如 Jeff 指出的那样tar --concatenate,在连接下一个存档之前可能需要很长时间才能到达 EOF。因此,如果您会遇到需要tar -i解压缩选项的“损坏”存档,我建议您执行以下操作:

如果您打算写入磁带设备,则tar --concatenate -f archive1.tar archive2.tar archive3.tar 最好 不要使用运行cat archive2.tar archive3.tar >> archive1.tar或管道dd。另请注意,如果磁带在(覆盖)写入新数据之前未归零,这可能会导致意外行为。出于这个原因,我将在我的应用程序中采用的方法是嵌套焦油,如问题下方的评论中所建议的。

上述建议基于以下非常小的样本基准:

time tar --concatenate -vf buffer.100025.tar buffer.100026.tar
  real  65m33.524s
  user  0m7.324s
  sys   2m50.399s

time cat buffer.100027.tar >> buffer.100028.tar
  real  46m34.101s
  user  0m0.853s
  sys   1m46.133s
Run Code Online (Sandbox Code Playgroud)

buffer.*.tar 文件的大小都是 100GB,除了每次调用外,系统几乎都处于空闲状态。时间差异足够大,我个人认为尽管样本量很小,但这个基准测试仍然有效,但是您可以自由地对此做出自己的判断,并且最好在您自己的硬件上运行这样的基准测试。


meu*_*euh 9

这可能对您没有帮助,但是如果您愿意-i在从最终存档中提取时使用该选项,那么您可以简单地cat将 tars 放在一起。一个 tar 文件以一个充满空的标头和更多的空填充结束,直到记录的末尾。使用--concatenatetar 必须遍历所有标头以找到最终标头的确切位置,以便在那里开始覆盖。

如果您只是cattars,则标题之间只有额外的空值。该-i选项要求 tar 忽略标头之间的这些空值。这样你就可以

cat  receiverTar1.tar receivedTar2.tar ... >>alltars.tar
tar -itvf alltars.tar
Run Code Online (Sandbox Code Playgroud)

另外,您的tar --concatenate示例应该有效。但是,如果您在多个 tar 存档中有相同的命名文件,则当您从生成的 tar 中提取所有文件时,您将多次重写该文件。