我想对压缩文件执行一系列重新压缩以研究它们的属性。
起初,我尝试简单地.zip
在循环中重新压缩文件:
for f in $(seq 1 100)
do
zip $f.zip -9 -v $(($f-1)).zip
done
Run Code Online (Sandbox Code Playgroud)
从一个固定0.zip
文件开始,我注意到,如果我重新运行这些行,除了前几个文件外,所有文件都有不同的大小。经过一番调查,我意识到这是由压缩文件的时间戳引起的。然后我在重新压缩之前重置时间戳:
for f in $(seq 1 100)
do
touch $(($f-1)).zip -t 200101010101
zip $f.zip -9 -v $(($f-1)).zip
done
Run Code Online (Sandbox Code Playgroud)
这次我使用zip
. 但是,tar
与gzip
算法一起 使用仍然不起作用。每次我运行:
for f in $(seq 1 100)
do
touch $(($f-1)).tar.gz -t 200101010101
tar cvfz $f.tar.gz $(($f-1)).tar.gz
done
Run Code Online (Sandbox Code Playgroud)
我得到不同的文件大小,从4.tar.gz
直到100.tar.gz
. 为什么会发生这种情况,我可以做些什么来防止它发生?
好的,所以我想我终于找到了一种按照我想要的方式获得事物的方法,它涉及使用tar
和gzip
分开(我同时使用 GNU 工具,tar 1.26 和 gzip 1.6)。
使用 中的z
选项时tar
,它首先创建 tar 文件,然后立即使用该时间戳创建 gzip 文件。换句话说,我无法控制中间文件的时间戳(我没有找到任何这样做的选项,除了更改正在存档的原始文件的 mtime),因此 .tar.gz 文件最终是非确定性的。
但是,如果我首先使用没有 gzip 的 tar,然后修改 tar 文件的时间戳(touch
例如使用),然后我使用 gzip 编译它,我会得到确定性的结果。
顺便说一句,使用两步过程生成的文件要小得多(在我的示例中为 ~400KB,而不是我在使用 tar 和 z 选项时获得的 ~1.2MB)。这一定与单独使用 tar+gzip 和 gzip 时的默认设置有关。由于我的原始文件无论如何都是空的,我不确定缩小大小是否有意义。
无论如何,我的问题的简短答案是:
可以得到确定性的结果,但要分开使用 tar 和 gzip;
tar -z
由于 gzip 压缩之前中间 tar 文件的时间戳,使用 时似乎无法获得确定性结果。此时间戳不受用户控制。
归档时间: |
|
查看次数: |
1847 次 |
最近记录: |