Linux|系统管理|WEB开发

关注Linux,系统管理,WEB开发以及开源世界

Compress指令并不是总是压缩文件

| Comments

用户观察到了一个很有意思的现象,某一个目录下10个小文件,每一个大概都只有几十个字节。都是纯文本。分别对这10个文件用compress指令压缩,结果发现其中一个压缩不成功,也没有给出任何报错信息。

将该文件传送到AIX 5上,使用compress压缩,则给出”file not change”的提示,依然没有压缩。

给文件重命名,也不行。另外创建一个文件,然后把文件内容复制过去,也不行。

我尝试用strace跟踪了compress压缩该文件的过程。发现压缩的确做了,但是最后却执行了unlink的操作,也就是把已经压缩好的文件删除了。

为什么要删除呢?先看看compress的帮助吧,发现有这样一个参数的说明:

-f Forces output file to be generated, even if one already. exists, and even if no space is saved by compressing. If -f is not used, the user will be prompted if stdin is. a tty, otherwise, the output file will not be overwritten.

其中提到了压缩空间的问题。我猜测可能是压缩效率的问题。 于是用compress -f 的方式,果然压缩成功了。
比较压缩前和压缩后的大小,结果发现压缩后的文件还比压缩前的文件要大。难怪,所以-f提高了即使没有压缩空间。
这倒是挺有意思,一来压缩一个文件,大小不减反增,比较少见。二来compress指令还去做比较? 于是下载了compress 4.2 的源代码,大致看了一下,果然有这么一个判断:

if (bytes_out >= bytes_in && !(force))
                exit_code = 2;

bytes_out是压缩后的字节,bytes_in是读入的字节,也就是原始文件的大小。force对应的是-f的参数。

没有想到,这开发人员还这么考虑呀。

Comments