快速组合 tar.gz 文件的最佳方式

And*_*rew 4 linux compression java bash tar

我正在寻找一种快速组合多个tar.gz文件的方法。

用例是客户端单击下载按钮并继续将tar.gz文件交付给他们。在我们的应用程序的GUI 中,有一个配置选项可以向出站下载添加附加信息。如果选择此选项,我将需要将其他tar.gz文件合并到出站下载中。

我在这里处理大量数据。额外的tar.gz文件在解压缩时超过一 GB。此外,始终交付的默认tar.gz文件解压缩时可能超过 10 GB,其中可以包含 100 多个文件。由于我使用的数据量很大,它以压缩格式 ( tar.gz )存储在磁盘上。

我希望在Bash Script 或Java 中实现这种机制。

dav*_*085 5

TLDR:您通常可以将它们连接起来

使用的文件格式gzip被设计为连接两个或多个压缩文件并解压缩结果与连接未压缩版本的数据相同;见 /sf/ask/560358011/
/sf/ask/1170083911/他们将其提取到单个文件中

有点类似,tar最初设计的格式是为了您可以将条目添加到存档的末尾。这实际上是必需的,因为“(t)ape (ar)chive”旨在并确实使用磁带进行备份和交换,而 1950 年代至 1980 年代(大约)的磁带驱动器无法安全地“重写”(更新)现有数据只添加到最后。(这些驱动器可以使用“磁带标记”分隔磁带上的逻辑文件,但 Unix 系统不支持磁带上的元数据即标签,并且仅通过物理数字位置管理大量磁带文件是一种 PITA,因此tar添加到更喜欢现有的档案。)

近年来,这已经变得不那么常见了,GNU tar 现在默认不支持它;你必须指定-i(或长格式--ignore-zeros)然后它工作正常:

$ printf 'ONEONEONE%90d\n' {0..99999} >file1
$ printf 'TWOTWOTWO%90d\n' {0..199999} >file2
$ ll
total 29300
-rw-r--r--. 1 dthomps users 10000000 Sep  9 02:14 file1
-rw-r--r--. 1 dthomps users 20000000 Sep  9 02:15 file2
$ tar -czf tar1.tgz file1
$ tar -czf tar2.tgz file2
    # or tar -cf - file1 |gzip >tar1.tgz and similarly for 2, see below
$ cat tar2.tgz tar1.tgz >combined.tgz
$ tar -tvzif combined.tgz
-rw-r--r-- dthomps/users 20000000 2016-09-09 02:15 file2
-rw-r--r-- dthomps/users 10000000 2016-09-09 02:14 file1
  # or gunzip <combined.tgz |tar -tvif - see below
$
Run Code Online (Sandbox Code Playgroud)

默认情况下,较旧的 tar 可能支持连接档案(否-i);如果我以后有时间启动一些旧的测试系统,我会更新。但是它们通常不支持-z像 gtar 这样的集成压缩,因此您需要使用tar cf - | gzip >gunzip < | tar -xf -形式。

如果您对存档中的文件使用相对路径,这在今天是常见和首选的,当您从连接结果中提取所有条目(或所有选定条目)时,都是相对于同一个新目录提取的,因此请确保创建每个条目使用可根据需要协同工作的相对路径归档“片断”。如果您希望附加片段中的文件替换主片段中的文件,请使用相同的相对路径/名称;如果要创建不同的文件,请使用不同的相对路径/名称。