【问题标题】:An appendable compressed archive可附加的压缩存档
【发布时间】:2013-06-24 08:38:26
【问题描述】:

我需要维护一个压缩的日志文件存档。日志文件名是唯一的,存档一旦展开,就是一个包含所有日志文件的目录。

当前的解决方案不能很好地扩展,因为它涉及一个 gzip 压缩的 tar 文件。每次添加日志文件时,他们首先解压缩整个存档,添加文件,然后重新 gzip。

是否有一个 Unix 存档工具可以添加到压缩存档中而无需完全扩展和重新压缩?或者如果参数的正确组合,gzip 可以执行此操作吗?

【问题讨论】:

    标签: unix compression append archive


    【解决方案1】:

    我为此使用zip -Zb(将文本日志增量附加到压缩存档):

    • 快速追加(索引在存档末尾,高效更新)
    • -Zb 使用 bzip2 压缩方法而不是 deflate。在 2018 年,这似乎可以安全使用(您需要一个相当现代的 unzip - 请注意,有些工具在看到 zip 文件时会假设 deflate,所以 YMMV)
    • 7z 是一个很好的选择:当您在同一操作中压缩所有文件时,压缩率比 zip 好得多。但是当您将文件一个一个地附加到存档(增量附加)时,压缩率仅比标准 zip 略好,并且类似于zip -Zb。所以现在我坚持使用zip -Zb

    澄清发生了什么以及为什么在末尾有索引对于“可附加”存档格式很有用,条目单独压缩:

    Before:
    ############## ########### ################# #
    [foo1.png    ] [foo2.png ] [foo3.png       ] ^
                                                 |
                                             index
    
    After:
    ############## ########### ################# ########### #
    [foo1.png    ] [foo2.png ] [foo3.png       ] [foo4.png ] ^
                                                             |
                                                     new index
    

    所以这不是append模式下的fopen,而是write模式下的fopen,然后是fseek,然后是write(这是我的心理模型,如果这是是错的)。我不能 100% 确定它在现实中会如此简单,它可能取决于操作系统和文件系统(例如,带有快照的文件系统可能对如何处理文件末尾的小写入有非常不同的看法…巨大的“YMMV”在这里??‍♂️)

    【讨论】:

    • 您能解释一下这是如何工作的吗?那么如何附加到 zip 文件呢?
    • 不知道你在这里问什么。 Zip 文件最后包含 N 个压缩条目 + 1 个索引。当您向其中添加新条目时,我猜 zip 实用程序将读取内存中的索引(足够小),将新条目写入索引所在的位置(因此,不会触及以前的条目,但可能会延长文件),然后在末尾写入一个新的更新索引。
    • 啊,我的误解来自一个包含单个文件的存档,并在其中更新了该文件。我的错。现在很清楚了。
    【解决方案2】:

    拥有一个可附加的压缩文件存档相当容易(但与可附加的压缩存档不同)。

    tar 可以选择将文件附加到存档的末尾(假设您有 GNU tar)

     -r, --append
           append files to the end of an archive
    

    您可以gzip 将日志文件添加到存档之前,并且可以继续使用更新的文件更新(附加)存档。

    $ ls -l
    foo-20130101.log
    foo-20130102.log
    foo-20130103.log
    $ gzip foo*
    $ ls -l
    foo-20130101.log.gz
    foo-20130102.log.gz
    foo-20130103.log.gz
    $ tar cvf backup.tar foo*gz
    

    现在您有另一个日志文件要添加到存档中:

    $ ls -l
    foo-20130104.log
    $ gzip foo-20130104.log
    $ tar rvf backup.tar foo-20130104.log
    $ tar tf backup.tar
    foo-20130101.log.gz
    foo-20130102.log.gz
    foo-20130103.log.gz
    foo-20130104.log.gz
    

    【讨论】:

      【解决方案3】:

      如果你不需要使用tar,我建议使用7-Zip。它有一个“添加”命令,我相信它可以满足您的需求。

      查看相关的 SO 问题:Is there a way to add a folder to existing 7za archive?

      另外,7-Zip 文档:https://sevenzip.osdn.jp/chm/cmdline/commands/add.htm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 2018-07-18
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多