我正在寻找一种方法来结合多个压缩文件文件。
用例是客户端点击下载按钮并继续压缩文件文件已交付给他们。有一个配置选项,可以在出站下载中添加其他信息图形用户界面我们的应用程序。如果选择此选项,我将需要合并其他压缩文件文件进行出站下载。
我在这里处理大量数据。额外的压缩文件文件未压缩时超过 1 GB。此外,默认压缩文件始终要交付的文件在未压缩时可能超过 10 GB,并且可能包含 100 多个文件。由于我处理的数据量很大,因此它以压缩格式存储(压缩文件) 保存在磁盘上。
我希望在以下方面实现这一机制猛击脚本或Java。
答案1
结论:通常你可以将它们连接起来
使用的文件格式gzip
设计为连接两个或多个压缩文件并解压结果可获得与连接未压缩版本相同的数据;请参阅
https://stackoverflow.com/questions/8005114/fast-concatenation-of-multiple-gzip-files
https://stackoverflow.com/questions/16715484/can-multiple-gz-files-be-combined-such-that-they-extract-into-a-single-file
类似地,该tar
格式最初设计为您只需将条目添加到档案末尾即可。这实际上是必需的,因为“(t)ape(ar)chive”旨在使用磁带进行备份和交换,并且 20 世纪 50 年代至 80 年代(大致)的磁带驱动器无法安全地“重写”(更新)现有数据,只能将其添加到末尾。(那些驱动器可以使用“磁带标记”在磁带上分隔逻辑文件,但 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
$
较旧的 tar 可能默认支持连接档案(否-i
);如果我稍后有时间启动一些旧测试系统,我会更新。但它们通常不支持-z
像 gtar 这样的集成压缩,因此您需要使用tar cf - | gzip >
和gunzip < | tar -xf -
形式。
如果您使用档案中的文件的相对路径(这是当今常见且首选的做法),则当您从连接结果中提取时,所有条目(或所有选定条目)都将相对于同一个新目录提取,因此请确保您创建的每个档案“片段”都具有可根据需要协同工作的相对路径。如果您希望附加片段中的文件替换主片段中的文件,请使用相同的相对路径/名称;如果您想创建不同的文件,请使用不同的相对路径/名称。