档案的压缩与打包

2/9/2008来源:Oracle教程人气:4855


  压缩的用途与技术:
  您是否有过文件档案太大,导致无法以一片软碟将他复制完成的困扰?又,您是否有过,发现一个软体里面有好多档案,这些档案要将他复制与携带都很不方便的问题? 还有,您是否有过要备份某些重要资料,偏偏这些资料量太大了,耗掉了你很多的硬碟与磁碟空间呢?这个时候,那个好用的『档案压缩』技术可就派的上用场了!因为这些比较大型的档案透过所谓的档案压缩技术之后,可以将他的磁碟使用量降低,可以达到减低档案容量的效果,此外,有的压缩程式还可以进行容量限制,使一个大型档案可以分割成为数个小型档案,以方便软碟片携带呢!
  那么什么是『档案压缩』呢?我们来稍微谈一谈他的原理好了。目前我们使用的电脑系统中都是使用所谓的 bytes 单位来计量的!不过,事实上,电脑最小的计量单位应该是 bits 才对啊,此外,我们也知道 1 byte = 8 bits 。但是假如今天我们只是记忆一个数字,亦即是 1 这个数字呢?他会如何记录?假设一个 byte 可以看成底下的模样:(注:由于 1 byte = 8 bits ,所以每个 byte 当中会有 8 个空格,而每个空格可以是 0, 1 ,这里仅是做为一个约略的介绍,读者不必刻意记忆 )
  □□□□□□□□
  而由于我们记录数字是 1 ,考虑电脑所谓的二进位喔,如此一来, 1 会在最右边占据 1 个 bit ,而其他的 7 个 bits 将会自动的被填上 0 啰!你看看,其实在这样的例子中,那 7 个 bits 应该是『空的』才对!不过,为了要满足目前我们的作业系统资料的存取,所以就会将该资料转为 byte 的型态来记录了!而一些聪明的电脑工程师就利用一些复杂的计算方式,将这些没有使用到的空间『丢』出来,以让档案占用的空间变小!这就是压缩的技术啦!简单的说,你可以将他想成,其实档案里面有相当多的『空间』存在,并不是完全填满的,而『压缩』的技术就是将这些『空间』填满,以让整个档案占用的容量下降!不过,这些『压缩过的档案』并无法直接被我们的作业系统所使用的,因此,若要使用这些被压缩过的档案资料,则必须将他『还原』回来未压缩前的模样,那就是所谓的『解压缩』啰!而至于压缩前与压缩后的档案所占用的磁碟空间大小,就可以被称为是『压缩比』啰!更多的技术文件或许你可以参考一下GNU 计画当中关于压缩指令 gzip 的说明文件 。当然,我 这里 也保留一份资料,做为未来参考之用呢!
  这个『压缩』与『解压缩』的动作有什么好处呢?最大的好处就是压缩过的档案容量变小了,所以你的硬碟容量无形之中就可以容纳更多的资料,此外,在一些网路资料的传输中,也会由于资料量的降低,好让网路频宽可以用来作更多的工作!而不是老是卡在一些大型的档案上面呢!目前很多的 WWW 网站也是利用档案压缩的技术来进行资料的传送,好让网站的可利用率上升喔!( 注:这种技术蛮有趣的!他让您网站上面『看的到的资料』在经过网路传输时,使用的是『压缩过的资料』,等到这些压缩过的资料到达你的电脑主机时,再进行解压缩,由于目前的电脑运算速度相当的快速,因此其实在网页浏览的时候,时间都是花在『资料的传输』上面,而不是 CPU 的运算啦!,如此一来,由于压缩过的资料量降低了,自然传送的速度就会增快不少! )若您是一位软体工程师,那么相信您也会喜欢将你自己的软体压缩之后提供大家下载来使用,究竟没有人喜欢自己的网站天天都是频宽满载的吧?!举个例子来说, linux 2.4.19 完整的核心大小约有 200 MB 左右,而由于核心主要多是 ASCII code 的存文字型态档案,这种档案的『多余空间』最多了。而一个提供下载的压缩过的 2.4.19 核心大约仅有 30MB 左右,差了几倍呢?您可以自己算一算喔!
  Linux 压缩档案的附档名
  假如您经常在网路上面捉 Linux 的资料下来玩的话,大概会晓得的是,这些供人下载的档案通常都是『压缩』过的!为了什么?上面已经稍微提过啦!呵呵!压缩过的档案具有节省频宽、节省磁碟空间等等的优点,并且还方便携带呢! ^_^ !而,您应该也会知道,这些被压缩过的档案,通常其附档名都是『 *.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2 』等等的,为什么要订定这些压缩档案附档名为这样的模样呢?这是因为在 Linux 上面压缩的指令相当的多,并且,这些压缩指令可能无法针对每种压缩档案都可以解的开,究竟目前的压缩技术五花八门,每种压缩计算的方法都不是完全相同的,所以啰,当你捉到某个压缩档时,自然就需要知道压缩他的是那个指令啦,好用来对照着解压缩啊! ^_^!也就是说,虽然 Linux 档案的属性基本上是与档名没有绝对关系的,能不能执行与他的档案属性有关而已,与档名的关系很小!但是,为了帮助我们小小的人类脑袋瓜子,所以适当的档案名称附档名还是必要的!因此,目前就有一些经常见到的压缩档案的附档名啦!我们仅列出常见的几样在底下,给大家权做参考之用:
  · *.Z comPRess 程式压缩的档案;
  · *.bz2 bzip2 程式压缩的档案;
  · *.gz gzip 程式压缩的档案;
  · *.tar tar 程式打包的资料,并没有压缩过;
  · *.tar.gz tar 程式打包的档案,其中并且经过 gzip 的压缩!
  目前常见的压缩程式主要就是如同上面提到的附档名对应的那些指令啦!最早期的要算是 compress 这个家伙了,而后,后来的 GNU 计画开发出新一代的压缩指令 gzip ( GNU zip ) 用来取代 compress 这个老牌的压缩指令,再来还有 bzip2 这个压缩比更好的压缩指令呢!不过,这些指令通常仅能针对一个档案来压缩与解压缩,如此一来,每次压缩与解压缩都要一大堆档案,岂不烦人?,此时,那个所谓的『打包软体』就显的很重要啦!在 Unix-Like 当中,有个软体很好玩,他就是 tar 这支程式!这个 tar 可以将很多档案『打包』成为一个档案!甚至是目录也可以这么玩。
不过,单纯的 tar 功能仅是『打包』而已,亦即是将很多档案集结成为一个档案,事实上,他并没有提供压缩的功能,后来, GNU 计画中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能!  
  底下我们就来谈一谈这些在 Linux 底下基本的压缩指令吧!
  · compress:
  语法:
  [root @test /root ]# compress [-d] filename 参数说明: -d :解压缩的参数! 范例: 先 copy /etc/man.config 到 root 底下,再将他压缩看看 [root @test /root]# cp /etc/man.config /root [root @test /root]# compress man.config [root @test /root]# compress -d man.config.Z [root @test /root]# uncompress man.config.Z
  ·这是用来压缩与解压缩附档名为 *.Z 的指令!所以看到 *.Z 的档案时,就应该要知道他是经由 compress 这个程式压缩的呦!这是最简单的压缩指令啰!不过,使用的时候需要非凡留意的是,当你以 compress 压缩之后,假如没有下达其他的参数,那么原本的档案就会被后来的 *.Z 所取代!以上面的案例来说明:原本压缩的档案为 man.config ,那么当压缩完成之后,将只会剩下 man.config.Z 这个经过压缩的档案啰!那么解压缩呢?呵呵,则是将 man.config.Z 解压缩成 man.config !使用上很简单啦!解压缩除了可以使用 compress –d 这个参数之外,也可以直接使用 uncompress !意思相同啦!
  ·
  ·gzip, zcat:
  语法:
  [root @test /root ]# gzip [-d#] filename <==压缩与解压缩 [root @test /root ]# zcat filename.gz <==读取压缩档内容 参数说明: -d :解压缩的参数! -# :压缩等级, 1 最不好, 9 最好, 6 是预设值! 范例: [root @test /root]# gzip man.config 会产生 man.config.gz 这个档案 [root @test /root]# zcat man.config.gz 会读取出 man.config 的内容 [root @test /root]# gzip -d man.config.gz [root @test /root]# gunzip man.config.gz 解压缩,产生 man.config 这个档案 [root @test /root]# gzip -9 man.config 以最大压缩比压缩 testing 这个档案!
  ·gzip 是用来压缩与解压缩附档名为 *.gz 的指令!所以看到 *.gz 的档案时,就应该要知道他是经由 gzip 这个程式压缩的呦!另外, gzip 也提供 压缩比的服务! -1 是最差的压缩比,但是压缩速度最快,而 -9 虽然可以达到较佳的压缩比(经过压缩之后,档案比较小一些!),但是却会损失一些速度!预设是 -6 这个数值! gzip 也是相当常使用的一个压缩指令呢!至于 zcat 则是用来读取压缩档资料内容的指令!假如我们刚刚压缩的档案是一个文字档,那么你还记得如何读取文字档吗?!没错!就是使用 cat ,那么读取压缩档呢?呵呵!就是使用 zcat 啰!由于 gzip 这个压缩指令主要想要用来取代 compress 的,所以 compress 的压缩档案也可以使用 gzip 来解开喔!同时, zcat 这个指令可以同时读取 compress 与 gzip 的压缩档呦!
  ·
  · bzip2, bzcat:
  语法:
  [root @test root]# bzip2 [-dz] filename <==压缩解压缩指令 [root @test root]# bzcat filename.bz2 <==读取压缩档内容指令 参数说明: -d :解压缩的意思! -z :压缩的意思! 范例: 同样的,我们以刚刚拷贝过来的 /root/man.config 这个档案为例 [root @test root]# bzip2 –z man.config [root @test root]# bzcat man.config.bz2 [root @test root]# bzip2 –d man.config.bz2 [root @test root]# bunzip2 man.config.bz2
  ·刚刚的 compress 附档名自动建立为 .Z ,这里的 bzip2 则是自动的将附档名建置为 .bz2 啰!所以当我们使用具有压缩功能的 bzip2 –z 时,那么刚刚的 man.config 就会自动的变成了 man.config.bz2 这个档名啰!好了,那么假如我想要读取这个档案的内容呢?是否一定要解开?当然不需要啰