Linux压缩命令

一. 几种常见的压缩格式

*.Z       compress 程序压缩的文件; *.gz      gzip 程序压缩的文件; *.bz2     bzip2 程序压缩的文件; *.tar     tar 程序打包的数据,并没有压缩过; *.tar.gz  tar 程序打包的文件,其中并且经过 gzip 的压缩!

1. 最早期的要算是 compress 这个家伙了。2. 后来的 GNU 计划开发出新一代的压缩指令 gzip ( GNU zip ) 用来取代 compress 这个老牌的压缩指令。3. 再来还有 bzip2 这个压缩比更好的压缩指令!不过,这些指令通常仅能针对一个文件来压缩与解压缩,如此一来,每次压缩与解压缩都要一大堆文件,岂不烦人?4. 此时,那个所谓的 [打包软件] 就显的很重要啦!在 Unix-Like 当中,有个软件很好玩,他就是 tar 这命令!这个 tar 可以将很多文件 [打包]成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是[打包]而已,亦即是将很多文件集结成为一个文件,事实上,他并没有提供压缩的功能。5. 后来, GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能!

二. 压缩指令

下面我们就来谈一谈这些在 Linux 底下基本的压缩指令吧!

1. compress (压缩与解压*Z文件)语法:

[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

现在很少用了!

使用的时候需要特别留意的是,当你以 compress 压缩之后,如果没有下达其它的参数,那么原本的文件就会被后来的 *.Z 所取代!以上面的案例来说明:原本压缩的文件为 man.config ,那么当压缩完成之后,将只会剩下 man.config.Z 这个经过压缩的文件啰!

解压缩除了可以使用 compress –d 这个参数之外,也可以直接使用 uncompress !ompress –d =uncompress。

2. gzip, zcat (压缩与解压*gz文件)语法:

[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 也提供 压缩比的服务! -1 是最差的压缩比,但是压缩速度最快,而 -9 虽然可以达到较佳的压缩比(经过压缩之后,文件比较小一些!),但是却会损失一些速度!预设是 -6 这个数值! gzip 也是相当常使用的一个压缩指令呢!

zcat 则是用来读取压缩文件数据内容的指令!假如我们刚刚压缩的文件是一个文字文件,那么你还记得如何读取文字文件吗?!没错!就是使用 cat ,那么读取压缩档呢?呵呵!就是使用 zcat 啰!由于 gzip 这个压缩指令主要想要用来取代 compress 的,所以 compress 的压缩文件也可以使用 gzip 来解开喔!同时, zcat 这个指令可以同时读取 compress 与 gzip 的压缩档呦!

解压缩,gzip -d = gunzip。

3. bzip2, bzcat (压缩与解压*bz2文件)语法:

[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

压缩用bzip2 –z ,那么刚刚的 man.config 就会自动的变成了 man.config.bz2 这个档名啰!

读取内容压缩文件的内容,可以使用简便的 bzcat 这个指令来读取内容!例如上面的例子中,我们可以使用 bzcat man.config.bz2 来读取数据而不需要解开!

解压缩时,这个文件的名称为 .bz, .bz2, .tbz, .tbz2 等等,那么就可以尝试使用 bzip2 -d来解看看啦!当然啰,也可以使用 bunzip2 = bzip2 –d 。

4. tar: 语法:

[root @test /root ]# tar [-zxcvfpP] filename  [root @test /root ]# tar -N 'yyyy/mm/dd' /path -zcvf target.tar.gz source  参数说明:  -c  :建立压缩文件的参数命令(create的意思)-x  :解压缩文件的参数命令。-t  :查看tarfile里的文件。注意 :c/x/t只能有一个,不可同时存在,因为不可能同时压缩与解压缩。-z  :是否同时具有 gzip 的属性?即是否要用gzip压缩?  -j  :是否同时具有 bzip2的属性?即是否要用bzip2压缩?-v  :压缩的过程中显示文件!  -f  :使用文件名,请留意,在 f 之后要立即接文件名喔!不要再加参数!   例如使用[tar -zcvfP tfile sfile]就是错误的写法,要写成          [tar -zcvPf tfile sfile]才对!-p  :使用原文件的原来属性(属性不会依据使用者而变)  -P  :可以使用绝对路径  -N  :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!  --exclude FILE:在压缩的过程中,不要将 FILE 打包!  范例:[root @test /root]# tar -cvf /tmp/etc.tar /etc  将/etc目录下的文件全部打包成为 /tmp/etc.tar  [root @test /root]# tar -zcvf /tmp/etc.tar.gz /etc  除打包外,同时以 gzip 压缩[root @test /root]# tar -xvf  /tmp/etc.tar  解 tar 的封包,请注意,由于没有 gzip 的作用,所以只要使用 –xvf 即可![root @test /root]# tar -zxvf /tmp/etc.tar.gz  这个就是有加上 gzip 的压缩的结果!所以需要加上 –z 呦![root @test /root]# tar –ztvf /tmp/etc.tar.gz这个 t 可以用来查看 tar 里面的文件信息呢!而不需要将他解开![root @test /root]# tar -zcvPf home.tar.gz /home  则建立起来的压缩档内文件为绝对路径  请注意,使用这个 P 的参数时,不要将 P 加在 f 后面,因为f 之后要立即接文件名才行喔![root @test /root]# tar -N '2002/06/25' -zcvf home.tar.gz /home  上面是说 在 /home 这个目录中,比 2002/06/25 日还要新的文件才会被打包进入 home.tar.gz 这个文件中!  [root @test /root]# tar -zcvf host.tar.gz / --exclude /mnt --exclude /proc  上面是说,将根目录的所有数据都打包进 host.tar.gz 这个文件中,但是 /mnt 及 /proc 则不打包!  [root @test /root]# tar -cvf - /home | tar -xvf -上面的意思是[ 将 /home 打包之后,直接解压缩在 /root 底下! ]嘿嘿!不需要再建立一次中间文件!不过,使用上面的语法最好使用[ 绝对路径 ],比较不会有问题!这个方式适合不想要建立中间文件时!

tar 可以将整个目录或者是规定的文件都整合成一个文件!例如上面的第三个范例,他可以将 /home/test 底下的文件全部整合成一个文件!而第一个范例中,则是将目录整合成一个文件!同时, tar 可以配合 gzip (这个 gzip 的功能已经已经附加上 tar 里面去了),同时整合并压缩!呵呵!很方便吧![ tar 用来作备份是很重要的指令! ] 而由于 tar 整合过后的文件我们通常会取名为 *.tar ,而如果还含有 gzip 的压缩属性,那么就取名为 *.tar.gz!取这个文件名只是为了方便我们记忆这个文件是什么属性罢了!并没有实际的意义在!

绝对路径与权限的问题

需要注意的是,在使用的参数方面,有还有几个有用的参数需要来了解一番,亦即是 -p 与 -P 这两个!如果你曾经在 crontab 里面下达过一些备份的指令时,那么常常会收到 root 的信件,就是说,系统会告诉你 [我将 / 的 tar 里头的内容拿掉了!] 也就是说,原本你备份的文件是 /home/test ,但是由于担心未来你在解开压缩的时候,会产生一些困扰,因为在 tar 里面的文件如果是具有 [ 绝对路径 ] 的话,那么你解开的文件将会 [ 一定 ] 在该路径下也就是 /home/test,而不是绝对路径(这里请用心的想一想!),这样子的最大困扰是,万一有人拿走了你的这个文件,并且将该文件在他的系统上面解开!万一他的系统上面正巧也有 /home/test 这个目录,哈哈!他的文件就会[ 正巧 ]被覆盖了!所以啰,在预设的情况中,如果是以 [ 绝对路径 ] 来建立打包文件,那么将会自动的将 / 拿掉!这是为了刚刚说明的 [安全] 为前提所做的默认值。好了!但是你就是要以绝对路径来建立打包的文件!那么就加入 -P 这个参数吧(请注意!是大写字符)!这样就可以啦!那么 -p 是什么(小写字符)?呵呵!那个 -p 是 permission 的意思,也就是[ 权限 ]啦!使用 -p 之后,被打包的文件将不会依据使用者的身份来改变权限喔!

文件的更新日期

这里还有一个值得注意的参数呦!那就是在备份的情况中很常使用的 -N 的这个参数!你可以参考一下上面的例子就可以知道啦!在这个例子当中,相当重要的就是那个日期啦!在备份的情况当中,我们都希望只要备份较新的文件就好了,为什么呢?因为旧的文件我们已经有备份啰!干嘛还要再备份一次,浪费时间也浪费系统资源!这个时候此一参数就显的相当的重要了啊!

标准输入输出

在上面的例子中,最后一个例子很有趣[ tar cvf – /home | tar -xvf – ]!他是直接以管线命令[ pipe ]来进行压缩、解压缩的过程!在上面的例子中,我们想要[ 将 /home 底下的数据直接 copy 到目前所在的路径,也就是 /root 底下来 ],但是又觉得使用 cp -r 有点麻烦,那么就直接以这个打包的方式来打包,其中,指令里面的 – 就是表示那个被打包的文件啦!由于我们不想要让中间文件存在,所以就以这一个方式来进行复制的行为啦!

tarfile 与 tarball

tar 的功能相当的多,而由于他是经由[ 打包 ]之后再处理的一个过程,所以常常我们会听到 tarball 的文件,那就是经由 tar 打包再压缩的文件啦!此外, tar 也可以用在备份的储存媒体上面,最常见的就是磁带机了!假设我的磁带机代号为 /dev/st0 ,那么我要将我的 /home 底下的数据都给他备份上去时,就是使用 tar /dev/st0 /home 就可以啦!很不错吧!

在 Linux 当中, gzip 已经被整合在 tar 里面了!但是 Sun 或者其它较旧的 Unix 版本中, 当中的 tar 并没有整合 gzip ,所以如果你需要解压缩的话,就需要这么做:

gzip -d testing.tar.gztar -xvf testing.tar 

第一个步骤会将文件解压缩,第二个步骤才是将数据解出来!与其它压缩程序不太一样的是, bzip2, gzip 与 compress 在没有加入特殊参数的时候,原先的文件会被取代掉,但是使用 tar 则原来的与后来的文件都会存在!5. cpio: 语法:

[root @test /root ]# cpio -covB  > [file|device]<==备份[root @test /root ]# cpio -icduv < [file|device]<==还原参数说明:  -o :将资料 copy 输出到文件或装置上  -i :将数据自文件或装置 copy 出来系统当中  -t :查看 cpio 建立的文件或装置的内容  -c :一种较新的 portable format 方式储存  -v :让储存的过程中文件名称可以在屏幕上显示  -B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes !     这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)  -d :自动建立目录!由于 cpio 的内容可能不是在同一个目录内,     如此的话在反备份的过程会有问题! 这个时候加上 -d 的话,     就可以自动的将需要的目录建立起来了!  -u :自动的将较新的文件覆盖较旧的文件!  范例:  [root @test /root]# find / -print | cpio -covB > /dev/st0  将搜寻到的文件存到磁带机  [root @test /root]# cpio -icduv < /dev/st0  将磁带机的数据还原回来!  [root @test /root]# cpio -icdvt < /dev/st0 > /tmp/content  将磁带机的内容(文件名而已)转存到 /tmp/content  [root @test /root]# find / -type -f | cpio -o > /tmp/root.cpio  [root @test /root]# cpio -i < /tmp/root.cpio  上面这个例子可以马上实作看看!先输出到 /tmp/root.cpio 这个文件,然后再给他还原回来!

这个 cpio 还蛮神奇的呢!他最适用于备份的时候使用的一个指令了!为什么呢?因为他并不像 cp 一样,可以直接的将文件给他 copy 过去,例如 cp * /tmp 就可以将所在目录的所有文件 copy 到 /tmp 底下,在 cpio 这个指令的用法中,由于 cpio 无法直接读取文件,而是需要[ 每一个文件或目录的路径连同文件名一起 ]才可以被记录下来!因此, cpio 最常跟 find 这个指令一起使用了!

这个 cpio 好像不怎么好用呦!但是,他可是备份的时候的一项利器呢!因为他可以备份任何的文件,包括 /dev 底下的任何装置文件!呵呵!所以他可是相当重要的呢!!您说是吧! 而由于 cpio 必需要配合其它的程序,例如 find 来建立档名,所以, cpio 与管线命令及命令重导向的相关性就相当的重要了!

备份:在备份的用法当中,他可以直接跟输出到文件或者是装置当中,但是如前面说过的,你必须要配合 find 这个指令较好呦!那个 -o 表示将文件或目录输出到右边去的意思!还记得命令重导向吗?对啦!就是那个东西啰!在上面的例子中,我们将备份的数据给他 copy 到磁带机里头去!那个磁带机的装置代号就是 /dev/st0 啰!

还原:那么如何给他反过来解开呢?呵呵!可以直接给他下达 cpio -i 就是 input 就对啦!例如上头的例子啰!这个指令可以多看看呢。

人要有梦想,有了梦想才会努力奋斗,

Linux压缩命令

相关文章:

你感兴趣的文章:

标签云: