一个可追加的压缩存档

8
我需要维护一个压缩的日志文件存档。日志文件名是唯一的,展开后的存档仅包含所有日志文件的一个目录。
当前的解决方案不太可扩展,因为它涉及到一个gzipped tar文件。每次添加一个日志文件时,他们必须先解压整个存档,然后添加文件并重新gzip压缩。
是否有Unix存档工具可以在完全展开和重新压缩的情况下添加到压缩的存档中?或者给定正确的参数组合,gzip能否执行此操作?
3个回答

4
我正在使用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

因此,这不是fopenappend模式下使用,而是假定fopenwrite模式下打开,然后使用fseek,最后进行write操作(这是我的心理模型,如果错了,请有经验的人指出)。我不能100%确定实际情况是否如此简单,这可能取决于操作系统和文件系统(例如,具有快照功能的文件系统可能对处理文件末尾的小写入有非常不同的看法......这里很容易产生巨大的“YMMV”‍♂️)。


你能解释一下这是如何运作的吗?那么,你如何向 zip 文件追加内容呢? - PascalVKooten
1
不确定您在这里询问什么。Zip文件包含N个压缩条目和1个索引,位于最末尾。当您向其中添加新条目时,我猜测zip实用程序将在内存中读取索引(足够小),将新条目写入索引所在的位置(因此不会触及先前的条目,但可能会扩展文件的长度),然后在末尾写入新的更新索引。 - Hugues M.
啊,我的误解来自于一个包含单个文件的存档,并在其中更新该文件。我的错。现在非常清楚了。 - PascalVKooten

3
很容易创建一个可添加文件的压缩归档文件(不同于可添加的压缩归档文件,注意区别)。
假设你有GNU tar,可以使用其选项将文件添加到归档文件的末尾。
 -r, --append
       append files to the end of an archive

在将日志文件添加到归档之前,您可以对其进行gzip处理,并且可以继续使用更新的文件追加(append)到归档中。

$ 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

0

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