【问题标题】:Archiving a group of gzipped files归档一组 gzip 文件
【发布时间】:2016-07-18 15:43:53
【问题描述】:

我有一组大约 10 个 gzip 压缩文件,我想将它们归档到一个文件中,以便用户下载。我想知道最好的方法是什么。

  1. Gunzip 一切,然后将整套文件 tar-gz 到 myfiles.tar.gz?
  2. 将 gz 文件集 tar 到 myfiles.tar

选项1似乎有不必要的步骤,因为原始文件已经被压缩了。

选项 2 似乎令人困惑,因为没有迹象表明存档中的文件确实被压缩了。

人们通常如何处理归档一组已压缩的文件?

我正在使用 Python(如果重要的话),但我正在通过 shell 执行进行操作。

【问题讨论】:

  • 如果您希望最终用户 untar-gz 一次并获取所需的文件,选项 1 会更好。选项 2 对您来说是更简单的方法,但最终用户必须解压缩,然后将单个 gz 文件解压缩

标签: python compression gzip tar gzipstream


【解决方案1】:

gzipped tar 存档不是压缩文件的存档。它是文件的压缩存档。相比之下,zip 存档是压缩文件的存档。

如果您希望能够提取(或更新)单个文件,压缩文件的存档是一种更好的存档格式。但它是一种较差的压缩技术;除非组件文件大多非常大或已经压缩,否则单独压缩文件会导致更多开销。

由于 gzipped tar 存档的主要用例是传输完整的存储库,并且整个存档通常会立即解压缩,因此无法解压缩和提取单个文件 [注 1] 的事实并不是很大成本。另一方面,改进的压缩比带来了明显的好处。

要回答这个问题,合并多个gzip压缩的tar档案的唯一方法是将它们全部解压,将它们组合成一个tar档案,然后重新压缩结果; 选项 1 在原帖中。

注意事项

  1. 当然,您可以解压整个存档并从解压流中提取单个文件;不需要保存解压的结果。 tar 实用程序将透明地执行此操作。但在后台,档案本身正在被解压缩。如果不解压缩整个存档,甚至无法列出 gzipped tar 存档的内容。

【讨论】:

    【解决方案2】:

    未压缩文件的 gzip 压缩档案绝对是您的用户想要的。由于您使用的是 Python,因此您可以跳过炮击并使事情变得更清洁(IMO)。它使用tarfilegzip.GzipFile 来处理归档和压缩部分。

    编者注:在撰写本文时,我偶然发现了一个您可能想知道的有趣错误 - https://blog.nelhage.com/2010/02/a-very-subtle-bug/

    from __future__ import with_statement  # god I hope you don't need this
    import gzip
    import sys
    import tarfile
    try:
        import io
    except ImportError:  # makes things work before Python 3
        import StringIO as io
    
    with tarfile.open(sys.argv[1], mode='w:gz') as archive:
        for name in sys.argv[2:]:
            with gzip.GzipFile(name) as gzip_file:
                buf = io.StringIO()
                buf.write(gzip_file.read())
                buf.seek(0)
    
                info = archive.gettarinfo(name)
                if info.name.endswith('.gz'):
                    info.name = info.name[:-3]
                info.size = buf.len
                archive.addfile(info, fileobj=buf)
    

    现在,如果未压缩的文件很大,我可能不会这样做,因为它会将每个文件作为一个块读入内存。这很好,因为它保留了文件属性,如 perms、times 以及存档文件中没有的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多