解压缩/逐部分提取文件

6

我在一台磁盘空间受限的共享服务器上,有一个gz文件,解压后变成了一个巨大的文件,超出了我的可用空间。我该如何“分批”提取它(比如每次10 MB),并处理每个部分,而不必整个文件都解压(即使是暂时地)!

不,这只是一个超级巨大的压缩文件,而不是一组文件...


嗨,David,你的解决方案看起来相当优雅,但如果我理解正确,似乎每次gunzip都从文件开头开始提取(并将其输出丢弃)。我确定这会对我所在的共享服务器造成巨大的压力(我认为它根本没有“预读”)-你有什么见解,可以让gunzip“跳过”必要的块吗?


我不相信可以像那样让gzip“跳过”压缩数据。gzip规范(http://www.gzip.org/zlib/rfc-gzip.html#file-format)指出该格式“不试图...提供对压缩数据的随机访问”。 - David Gelhar
2个回答

13
如果你正在使用(Unix/Linux)shell工具进行此操作,你可以使用gunzip -c将文件解压缩到标准输出,并使用dd命令的skipcount选项复制其中的一个块。例如:
gunzip -c input.gz | dd bs=10485760 skip=0 count=1 >output

然后skip=1,skip=2,等等。


David的见解非常精彩 - 这不完全是我在寻找的,但我仍然会接受它... - Dave

1

很不幸,我不知道有现成的Unix命令可以完全满足您的需求。您可以用任何编程语言轻松地写个小程序来实现,比如Python中的cutter.py(当然,任何编程语言都可以):

import sys
try:
  size = int(sys.argv[1])
  N = int(sys.argv[2])
except (IndexError, ValueError):
  print>>sys.stderr, "Use: %s size N" % sys.argv[0]
  sys.exit(2)
sys.stdin.seek((N-1) * size)
sys.stdout.write(sys.stdin.read(size))

现在,gunzip <huge.gz | python cutter.py 1000000 5 > fifthone会将恰好一百万个字节放入文件fifthone中,在未压缩的流中跳过前四百万个字节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接