Linux 档案的压缩与打包

hickwu 2011-12-12

gzip, zcat:

语法:
[root @test /root ]# gzip [-d#] filename <==压缩与解压缩 

[root@test/root]#zcatfilename.gz<==读取压缩档内容

参数说明:

-d:解压缩的参数!

-#:压缩等级,1最不好,9最好,6是默认值!

范例:

[root@test/root]#gzipman.config

会产生 man.config.gz 这个档案 

[root @test /root]# zcat man.config.gz 会读取出 man.config 的内容

[root @test /root]# gzip -d man.config.gz  

[root@test/root]#gunzipman.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@testroot]#bzip2[-dz]filename<==压缩解压缩指令

    [root@testroot]#bzcatfilename.bz2<==读取压缩文件内容指令

    参数说明:

    -d:解压缩的意思!

    -z:压缩的意思!

    范例:

    同样的,我们以刚刚拷贝过来的/root/man.config这个档案为例

    [root@testroot]#bzip2–zman.config

    [root@testroot]#bzcatman.config.bz2

    [root@testroot]#bzip2–dman.config.bz2

    [root@testroot]#bunzip2man.config.bz2

    刚刚的compress附档名自动建立为.Z,这里的bzip2则是自动的将附档名建置为.bz2啰!所以当我们使用具有压缩功能的bzip2–z时,那么刚刚的man.config就会自动的变成了man.config.bz2这个档名啰!好了,那么如果我想要读取这个档案的内容呢?是否一定要解开?当然不需要啰!可以使用简便的bzcat这个指令来读取内容即可!例如上面的例子中,我们可以使用bzcatman.config.bz2来读取数据而不需要解开!此外,当您要解开一个压缩档时,这个档案的名称为.bz,.bz2,.tbz,.tbz2等等,那么就可以尝试使用bzip2来解看看啦!当然啰,也可以使用bunzip2这个指令来取代bzip2–d啰

     


tar:

语法:[root@test/root]#tar[-zxcvfpP]filename

[root@test/root]#tar-N'yyyy/mm/dd'/path-zcvftarget.tar.gzsource

参数说明:

-z:是否同时具有gzip的属性?

-x:解开一个压缩档案的参数指令!

-t:查看tarfile里面的档案!

-c:建立一个压缩档案的参数指令

-v:压缩的过程中显示档案!

-f:使用档名,请留意,在f之后要立即接档名喔!不要再加参数!

 例如使用『tar-zcvfPtfilesfile』就是错误的写法,要写成

 『tar-zcvPftfilesfile』才对喔!

-p:使用原档案的原来属性(属性不会依据使用者而变)

-P:可以使用绝对路径

-N:比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的档案中!

--excludeFILE:在压缩的过程中,不要将FILE打包!

范例:

[root@test/root]#tar-cvfdirectory.tardirectory

只将目录整合打包成一个档案 

[root @test /root]# tar -zcvf directory.tar.gz directory  除了将目录打包外,同时以 gzip 压缩 

[root @test /root]# tar -zcvf filename.tar.gz  /home/test/*  将 /home/test/ 这个目录下的档案全部打包并压缩成为一个 filename.tar.gz 的档案

[root @test /root]# tar -xvf  directory.tar  解 tar 的封包,请注意,由于没有 gzip (.tar 而非 .tar.gz) 的作用,所以只要使用 –xvf 即可!不需要加上 z ,否则会显示有问题!

[root @test /root]# tar -zxvf directory.tar.gz  这个就是有加上 gzip 的压缩的结果!所以需要加上 –z 呦!

[root @test /root]# tar –ztvf directory.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 底下!』嘿嘿!不需要再建立一次中间档案!不过,使用上面的语法最好使用『绝对路径』,比较不会有问题!这个方式适合不想要建立中间档案时!

  • 这是一个多用途的压缩指令!刚刚我们提到的 compress 与 gzip 是可以适用在一个档案的压缩上面,但是如果是要压缩一个目录呢?!这时该如何是好?!呵呵! tar 就派上用场了! 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 有点麻烦,那么就直接以这个打包的方式来打包,其中,指令里面的 - 就是表示那个被打包的档案啦!由于我们不想要让中间档案存在,所以就以这一个方式来进行复制的行为啦!
 
  • tar 的功能相当的多,而由于他是经由『打包』之后再处理的一个过程,所以常常我们会听到 tarball 的档案,那就是经由 tar 打包再压缩的档案啦!此外, tar 也可以用在备份的储存媒体上面,最常见的就是磁带机了!假设我的磁带机代号为 /dev/st0 ,那么我要将我的 /home 底下的数据都给他备份上去时,就是使用 tar /dev/st0 /home 就可以啦!很不错吧!
 
在 Linux 当中, gzip 已经被整合在 tar 里面了!但是 Sun 或者其它较旧的 Unix 版本中, 当中的 tar 并没有整合 gzip ,所以如果你需要解压缩的话,就需要这么做:
  

gzip-dtesting.tar.gz

tar-xvftesting.tar

 
第一个步骤会将档案解压缩,第二个步骤才是将数据解出来!与其它压缩程序不太一样的是, bzip2, gzip 与 compress 在没有加入特殊参数的时候,原先的档案会被取代掉,但是使用 tar 则原来的与后来的档案都会存在呦!
  • cpio:
  • 语法:[root@test/root]#cpio-covB>[file|device]<==备份

    [root@test/root]#cpio-icduv<[file|device]<==还原

    参数说明:

    -o:将资料copy输出到档案或装置上

    -i:将数据自档案或装置copy出来系统当中

    -t:查看cpio建立的档案或装置的内容

    -c:一种较新的portableformat方式储存

    -v:让储存的过程中文件名称可以在屏幕上显示

    -B:让预设的Blocks可以增加至5120bytes,预设是512bytes!

    这样的好处是可以让大档案的储存速度加快(请参考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 就对啦!例如上头的例子啰!这个指令可以多看看呢

相关推荐