8

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

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

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

4

3 回答 3

4

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

  • 快速追加(索引在存档末尾,更新效率高)
  • -Zb使用bzip2压缩方法而不是deflate。在 2018 年,这似乎可以安全使用(你需要一个相当现代的unzip——注意一些工具在看到 zip 文件时会假设放气,所以 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

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

于 2018-08-07T12:45:14.653 回答
3

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

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
于 2013-06-27T05:49:23.053 回答
0

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

请参阅相关的 SO 问题:有没有办法将文件夹添加到现有的 7za 存档?

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

于 2017-03-07T20:08:16.523 回答