是否可以在不提取压缩文件的情况下从压缩文件中删除字符



我有一个大约200 MB的压缩文件,格式是tar.gz文件。我知道我可以提取其中的xml文件。它包含几个小的5GB xml文件。我正在尝试从xml文件中删除某些字符。

所以我最基本的问题是:在不提取压缩文件内容的情况下,是否有可能实现这一点?

我正试图加快读取xml文件以查找要删除的字符的过程。

您必须解压缩、更改文件,然后重新压缩文件。这是没有办法的。

但是,这并不一定包括将文件写入存储器。您可能能够以的方式进行您喜欢的更改,即所有操作都只在内存中完成,而不需要在某个地方有完整的解压缩文件。Unix使用管道执行此类任务。

下面是一个如何做到这一点的例子:

  1. 创建两个随机文件:
echo "hello world" > a
echo "hello world" > b
  1. 创建一个包含以下内容的压缩存档:
tar -c -z -f x.tgz a b
  1. 通过转换器传输未压缩存档的内容。不幸的是,我还没有找到任何基于shell的方法来做到这一点,但您也在标记中指定了Python,使用tarfile模块可以实现这一点:

这是文件tar.py:

#!/usr/bin/env python3
import sys
import tarfile
tar_in  = tarfile.open(fileobj=sys.stdin.buffer,  mode='r:gz')
tar_out = tarfile.open(fileobj=sys.stdout.buffer, mode='w:gz')
for tar_info in tar_in:
reader = tar_in.extractfile(tar_info)
if tar_info.path == 'a':  # my example file names are "a" and "b"
# now comes the code which makes our change:
# we just skip the first two bytes in each file:
reader.read(2)  # skip two bytes
tar_info.size -= 2  # reduce size in info object as well
# add the (maybe changed) file to the output:
tar_out.addfile(tar_info, reader)
tar_out.close()
tar_in.close()

这可以这样称呼:

./tar.py < x.tgz > y.tgz

y.tgz将再次包含这两个文件,但在a中,前两个字节将被跳过(因此其内容将为llo world(。

你会注意到,你需要事先知道零钱的大小。tar被设计为处理文件,因此它需要将入口文件的大小写入tar信息数据报中,该数据报位于结果文件中的每个入口文件之前,所以我看不出有什么办法可以解决这个问题。对于压缩输出,也不可能在写入所有输出后跳回并调整文件大小。

但正如你所表达的问题一样,这在你的情况下可能是可能的。

您所要做的就是提供一个类似文件的对象(可以是Popen对象的输出流(,就像我的简单示例中的reader一样。

相关内容

  • 没有找到相关文章

最新更新