可附加的压缩存档

Cha*_*hap 6 unix compression append archive

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

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

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

Hug*_* M. 5

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

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

为了澄清发生的情况以及为什么在末尾添加索引对于“可附加”归档格式(条目单独压缩)很有用:

\n\n
Before:\n############## ########### ################# #\n[foo1.png    ] [foo2.png ] [foo3.png       ] ^\n                                             |\n                                         index\n\nAfter:\n############## ########### ################# ########### #\n[foo1.png    ] [foo2.png ] [foo3.png       ] [foo4.png ] ^\n                                                         |\n                                                 new index\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以这不是fopenappend模式中,但大概是fopenwrite模式中,然后fseek,然后write(这是我的心理模型,有人让我知道这是否是错误的)。我不能 100% 确定它实际上会如此简单,它可能取决于操作系统和文件系统(例如,带有快照的文件系统可能对如何处理一个文件末尾的小写入有非常不同的看法)文件\xe2\x80\xa6巨大的“YMMV”在这里\xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f)

\n


dev*_*ull 3

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

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

 -r, --append
       append files to the end of an archive
Run Code Online (Sandbox Code Playgroud)

您可以在添加到存档之前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
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)