Unix 可追加的压缩档案

Unix 可追加的压缩档案,unix,compression,append,archive,Unix,Compression,Append,Archive,我需要维护日志文件的压缩存档。日志文件名是唯一的,存档一旦展开,就只是一个包含所有日志文件的目录 当前的解决方案伸缩性不好,因为它涉及一个gzip tar文件。每次添加日志文件时,他们首先解压缩整个归档文件,添加文件,然后重新gzip 是否有Unix存档工具可以添加到压缩的存档中,而无需完全扩展和重新压缩?或者gzip可以在参数组合正确的情况下执行此操作吗?拥有压缩文件的可追加存档相当容易(但与可追加压缩存档不同) tar有一个选项可以将文件附加到归档文件的末尾(假设您有GNU tar) 在添加

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

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


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

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

tar
有一个选项可以将文件附加到归档文件的末尾(假设您有GNU tar)

在添加到存档之前,您可以
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

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

见相关问题:


另外,7-Zip文档:

我使用的是
Zip-Zb
(将文本日志增量添加到压缩存档中):

  • 快速追加(索引位于存档的末尾,更新效率高)
  • -Zb
    使用bzip2压缩方法而不是deflate。在2018年,这似乎是安全的(你需要一个相当现代的
    解压
    ——注意,一些工具在看到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
append
模式下,而是
fopen
write
模式下,然后
fseek
,然后
write
(这是我的思维模式,如果这是错误的,有人会告诉我)。我不能100%确定它在现实中是否会如此简单,它可能取决于操作系统和文件系统(例如,带有快照的文件系统可能对如何处理文件末尾的小写入有非常不同的意见…巨大的“YMMV”在这里,您可以解释一下这是如何工作的吗?您如何将其附加到zip文件中?不确定您在这里要问什么。zip文件包含N个压缩项+1个索引。当您向其中添加一个新项时,我猜zip实用程序将读取内存中的索引(足够小),将新项写入索引所在的位置(所以,不涉及以前的条目,但可能会延长文件的长度),然后在最后写一个新的更新索引。啊,我的误解来自一个包含单个文件的存档,并在其中更新该文件。我的错。现在很清楚了。
Before:
############## ########### ################# #
[foo1.png    ] [foo2.png ] [foo3.png       ] ^
                                             |
                                         index

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