《Linux系统》之"皮毛系列"(九)文件的解压缩与打包

一、压缩的意义

在备份文件资料时,你是否有过因文件太大,发现你的硬盘空间快不够用了呢?在写邮件时,你是否也有过因文件太大而发现不能上传到附件里呢?在下载资料时,你是否因文件太大而抱怨呢?我想,应该都有过。

这个时候,压缩技术就派上用场了。因为压缩技术可以使文件所占磁盘空间更小,换句话说,就是以某种合理的逻辑算法将文件的字节数量变的更少。

 有人就想了,磁盘最小的存储单位的就是byte,怎么可能减少?别忘了,字节也是由8位二进制构成的,即1byte=8bit。从这一点来讲,实际上磁盘中的最小计量单位应该是bit。

为什么能压缩呢?我来举个例子说明:我们在硬盘上存储数字1的时候,存储空间最小也应该占有8个位置,我们将位置换成8个方块来表示,如下:

               

存储数字1的时候,1应该存储在最右边的方块里,而左边7个方块里将自动存储7个0。其实,我们知道,左边这7个方块里应该是空的才对,只不过为了满足计算机的需求,我们才以8bit的字节形式存储数据。但是,世界上不乏聪明绝顶的人,他们通过算法将“空的方块”截取下来“扔掉”,以让文件占据的空间更小,这就是压缩

刚才的例子是一种压缩技术,再比如,还有这样一种算法,比如你文件里的某一行数据中,是这样存储的二进制:1010101011111.......,里面共有100个1,那么压缩算法就只记录“100个1”,而不是使用100个bit来存储1,这样做,也大大减少了文件的磁盘占用空间。

简单来说,就是通过一些复杂的算法,将文档里没有充分利用的那么“空位置”利用上,来做到使文件对磁盘的占用空间降低。 不过,压缩后的文件并不能直接被我们当成普通文件来进行"作业"。想要正常作业,必须将它还原会原来的样子,即解压缩技术。压缩后与压缩前所占的空间大小比较,我们称之为压缩比

二、Linux的常用压缩指令。

每一种压缩技术都对应一种指令,Linux系统上常用的压缩指令有gzip、bzip2及新兴的xz,为了支持windows下的zip压缩技术,Linux也有zip压缩技术。

1、gzip压缩指令  ---->gunzip解压缩指令

命令原意:gnu zip                                  命令路径:/bin/gzip
执行权限:所有用户                               压缩后文件格式:.gz
语法:gzip   【选项】 【[文件】 

常用选项:
-v  :可以显示压缩比,文件名等信息
-#  :#为数字,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
-d  :解压缩参数
-c  :将压缩的过程产生的数据显示出来

注意事项:
1、gzip命令只能压缩文件,不能压缩目录
2、gzip对文件压缩后,产生一个.gz的压缩文件,不保留原文件
3、可以使用gzip -d  代替 gunzip  进行解压缩

首先,我们将/etc/services文件copy到/home/michael/test下,查看此文件属性,文件大小为641020

-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services

应用案例1:不带参数进行压缩services

[michael@admin test]$ gzip services 
[michael@admin test]$ ll
-rw-r--r--. 1 michael michael 127223 12月 21 20:59 services.gz
// 默认压缩等级为-6,压缩比例 (641020-127223)/641020 = 80.2%

应用案例2:带参数【-v】进行压缩services

[michael@admin test]$ gzip -d services.gz        # 使用gzip -d 替代gunzip 进行解压缩
[michael@admin test]$ gzip -v services         
services:     80.2% -- replaced with services.gz          #压缩比与案例1计算的结果是一样的

应用案例3:指定压缩等级进行压缩services

[michael@admin test]$ gunzip services.gz        #使用gunzip指令解压缩
[michael@admin test]$ gzip -v -9 services 
services:     80.3% -- replaced with services.gz          #压缩比例更高了吧
[michael@admin test]$ ll
-rw-r--r--. 1 michael michael 126614 12月 21 20:59 services.gz

应用案例4:保留原文件的写法

[michael@admin test]$ gzip -1 -v -c services > services.gz            # 参数-c    同时必须指定压缩后的名称  
services:     77.2%
[michael@admin test]$ ll
-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services           <==原文件
-rw-rw-r--. 1 michael michael 146161 12月 21 22:28 services.gz     <==新文件

[michael@admin test]$ zgrep -n 'http' services.gz                #  使用zgrep命令在压缩文件内寻找http字串的所在行
14:#       http://www.iana.org/assignments/port-numbers
89:http            80/tcp          www www-http    # WorldWideWeb HTTP
90:http            80/udp          www www-http    # HyperText Transfer Protocol
...........................

2、bzip2压缩命令 ---->bunzip2解压缩命令

命令路径:/usr/bin/bzip2                                  执行权限:所有用户                               
压缩后文件格式:.bz2
语法:bzip2   【选项】 【[文件】 

常用选项:
-v  :可以显示压缩比,文件名等信息
-#  :#为数字,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
-d  :解压缩参数
-c  :将压缩的过程产生的数据显示出来
-k  : 压缩后,保留源文件

看以下应用案例:还是用services文件进行示范

#不带参数进行压缩
[michael@admin test]$ bzip2 services       
[michael@admin test]$ ll
-rw-r--r--. 1 michael michael 115774 12月 21 20:59 services.bz2

#解压文件,使用选项【-v】查看压缩信息
[michael@admin test]$ bzip2 -d services.bz2 
[michael@admin test]$ bzip2 -v -9 services 
  services:  5.537:1,  1.445 bits/byte, 81.94% saved, 641020 in, 115774 out.

#使用bunzip2解压后,再次进行保留原文件压缩
[michael@admin test]$ bunzip2 services.bz2 
[michael@admin test]$ bzip2 -v -k -1 services 
  services:  5.395:1,  1.483 bits/byte, 81.46% saved, 641020 in, 118825 out.
[michael@admin test]$ ll
-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services         <==原文件
-rw-r--r--. 1 michael michael 118825 12月 21 20:59 services.bz2  <==压缩文件

从上述案例中我们可以看到,bzip2的用法与gzip的用法基本相同,只不过是产生的扩展名不一样而已。在算法上,bzip2更突出一些,压缩后的文件占的空间更小了。不过,仍是有代价的,那就是在压缩时间上,可能会更久一些。当然,如果你想压缩的更小一点,那就牺牲一点时间吧

3、xz压缩命令

命令路径:/usr/bin/xz                                  执行权限:所有用户                               
压缩后文件格式:.xz
语法:xz【选项】 【[文件】 

常用选项:
-v  :可以显示压缩比,文件名等信息
-#  :#为数字,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
-d  :解压缩参数
-c  :将压缩的过程产生的数据显示出来
-k  : 压缩后,保留源文件

xz压缩命令的用法和上面两个命令的用法也都差不多,我们直接看案例吧

#查看当前目录的文件属性
[michael@admin test]$ ll
-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services
-rw-r--r--. 1 michael michael 115774 12月 21 20:59 services.bz2
-rw-rw-r--. 1 michael michael 127223 12月 22 00:23 services.gz

#使用xz压缩命令进行压缩吧
[michael@admin test]$ xz -v services
services (1/1)
  100.0 %                91.3 KiB / 626.0 KiB = 0.146                         
[michael@admin test]$ ll
-rw-r--r--. 1 michael michael 115774 12月 21 20:59 services.bz2
-rw-rw-r--. 1 michael michael 127223 12月 22 00:23 services.gz
-rw-r--r--. 1 michael michael  93496 12月 21 20:59 services.xz
#  我们可以看到xz压缩的文件占空间更小了

#我们将.xz文件进行解压
[michael@admin test]$ xz -d services.xz 

#我们进行保留源文件,压缩写法
[michael@admin test]$ xz -k services
[michael@admin test]$ ll

当我们使用  【 time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz]  】这种写法来查看时间时,我们会发现xz的压缩时间要大于前两个,毕竟压缩后的占用空间更小了。所以,如果你认为时间比较重要,那么 gzip 恐怕是比较适合你。如果你认为空间是你的考量,那么xz指令更适合你哦。

三、打包指令tar

我们可以发现上面的那几个压缩命令,只能对文件进行压缩,虽然可以指定目录,但是实际上还是将目录内的文件进行分别压缩。而windows系统下的winrar这类的压缩软件却可以把多个文件压缩成一个文件,实在是方便。

Linux系统上难道就没有这样的指令吗?其实是有的,那就是大名鼎鼎的打包命令tar。打包这个概念,我们可以理解为将多个文件或目录打包成一个文件的意思。tar指令不仅将多个文件或目录进行打包,甚至还可以通过上面那几个压缩命令来对打包后的文件进行压缩。功能很强大吧。window系统也兼容了tar指令打包压缩后的文件处理。

1、语法格式和参数

命令名称:tar 
命令路径:/bin/tar
执行权限:所有用户
语法:tar   【选项】  【目录】 

tar的选项特别多,这里只介绍一些常用的选项:

-c  : 创建打包文档,可以使用-v来查看过程中被打包的文件名。
-v  : 在压缩/解压缩过程中,显示正在被处理的文件或目录名。        
-z  : 通过gzip指令进行压缩或解压缩,此时最好命名为*.tar.gz。
-j   : 通过bzip2指令进行压缩或解压缩,此时最好命名为*.tar.bz2。
-J  : 通过xz指令对进行压缩或解压缩,此时最好命令为*.tar.xz。

-x   用于解包或解压缩,可以使用-C配合解到特定目录下。
-C   用于指定解压缩到特定目录下。 格式: -C  path

-t    用于查看打包文档内有哪些文件名。

-f    在打包或解包时用于指定要处理的文档名称。建议单独一项,避免忘记。格式:-f   filename

-p  保留文件的原本权限和属性,常用于备份文件

大致格式如下:

[hyxy@master]$  tar [-z|-j|-J] [cv] [-f  新文档名]  filename......            <==打包并压缩 
[hyxy@master]$  tar [-z|-j|-J] [tv] [-f  已有tar文档名]                           <==查看压缩
[hyxy@master]$  tar [-z|-j|-J] [xv] [-f 已有tar文档名] [-C pathname]   <==解压缩

请看下面案例1:我们要将/etc目录进行打包并压缩到 /home/hyxy/test目录里  (先切换root身份)

[root@master test]# tar -zpcv -f etc1.tar.gz /etc
[root@master test]# tar -jpcv -f etc2.tar.bz2 /etc
[root@master test]# tar -Jpcv -f etc3.tar.xz /etc
[root@master test]# ls -lS
-rw-r--r--. 1 root root 10071695 12月 25 13:22 etc1.tar.gz
-rw-r--r--. 1 root root  8515095 12月 25 13:23 etc2.tar.bz2
-rw-r--r--. 1 root root  5996616 12月 25 13:24 etc3.tar.xz

我们可以看到上述三个压缩指令,-J也就是xz压缩后的文档最小,但是花费的时间也最久。所以,各位使用-z,-j还是-J,请考虑自己的情况,到底是考虑空间,还是考虑时间。

应用案例2:查看压缩文档里的文件名  配合more指令

[root@master test]# tar -ztv -f etc1.tar.gz | more
drwxr-xr-x root/root         0 2018-12-25 13:14 etc/
drwxr-x--- root/root         0 2018-12-22 11:31 etc/audit/
-rw-r----- root/root       701 2012-06-22 17:43 etc/audit/auditd.conf
.................................

应用案例3:解压缩文档。

[root@master test]  tar -zxv -f etc1.tar.gz
[root@master test] ll
............................
drwxr-xr-x. 118 root root    12288 12月 25 13:14 etc
-rw-r--r--.   1 root root 10071695 12月 25 13:22 etc1.tar.gz
............................ 

应用案例4:解压缩文档到指定目录dir1下,【-C】。

[root@master test]  tar -jxv -f etc2.tar.bz2 -C dir1
[root@master test] cd dir1
[root@master dir2]# ll
drwxr-xr-x. 118 root root 12288 12月 25 13:14 etc

应用案例5:将文档里的单一文件解压出来

第一步:先使用管道和grep指令查看你要解压的文件名称
[root@master test]  tar -jtv -f etc2.tar.bz2  | grep 'shadow'      
---------- root/root      1023 2018-12-25 11:37 etc/shadow
---------- root/root       666 2018-12-25 11:35 etc/gshadow
---------- root/root       900 2018-12-25 11:35 etc/shadow-
---------- root/root       679 2018-12-25 11:34 etc/gshadow-

第二步:在要解压的压缩文档后 添加单一文件名
[root@master test]# tar  -jxv  -f  etc2.tar.bz2   etc/shadow
etc/shadow
[root@master dir2]# ll etc
----------. 1 root root 1023 12月 25 11:37 shadow

四、zip/upzip指令

为了支持windows下的zip压缩命令,linux下也提供这个命令的用法。

1、zip压缩命令

压缩命令:zip
命令路径:/usr/bin/zip                                 执行权限:所有用户
压缩后文件格式:.zip  (可以任意,但是最好用这个作为标识)
语法:     zip   【选项】【压缩后文件名称】【原文件或目录】

常用选项:
-v  : 显示压缩数据
-r  : 压缩目录必选项

zip压缩指令可以对文件或目录进行压缩。我们通过以下应用案例来使用方法:

#指定压缩后的名称services.zip  压缩文件services
[michael@admin test]$ zip  -v  services.zip  services 
  adding: services     (in=641020) (out=127196) (deflated 80%)
total bytes=641020, compressed=127196 -> 80% savings
[michael@admin test]$ ll
drwxrwxr-x. 2 michael michael   4096 12月 21 23:40 dir1
-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services             <==保留源文件
-rw-rw-r--. 1 michael michael 127362 12月 21 23:42 services.zip      <==压缩文件

#指定压缩文件的生成位置和名称
[michael@admin test]$ zip -v ./dir1/services.zip services
  adding: services     (in=641020) (out=127196) (deflated 80%)
total bytes=641020, compressed=127196 -> 80% savings
[michael@admin test]$ cd dir1/     进入dir1目录中就可以看到压缩文件了
[michael@admin dir1]$ ll
-rw-rw-r--. 1 michael michael 127362 12月 21 23:44 services.zip

#压缩目录的写法
[michael@admin test]$ zip -r ./dir1.zip dir1/
  adding: dir1/ (stored 0%)
  adding: dir1/services.zip (stored 0%)
[michael@admin test]$ ll
drwxrwxr-x. 2 michael michael   4096 12月 21 23:44 dir1         <==保留源目录
-rw-rw-r--. 1 michael michael 127684 12月 21 23:54 dir1.zip       <==压缩文件
-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services
-rw-rw-r--. 1 michael michael 127362 12月 21 23:42 services.zip

2、unzip压缩命令

命令名称:unzip                             
命令路径:/usr/bin/unzip                               执行权限:所有用户 
语法:     unzip 【压缩文件】 【-d  path】

应用案例:

[michael@admin test]$ ll        #首先查看一下当前目录下的文件,只有两个
-rw-rw-r--. 1 michael michael 127684 12月 21 23:54 dir1.zip
-rw-rw-r--. 1 michael michael 127362 12月 21 23:42 services.zip
[michael@admin test]$ unzip services.zip     #对services.zip进行解压缩
Archive:  services.zip
  inflating: services       
[michael@admin test]$ ll
-rw-rw-r--. 1 michael michael 127684 12月 21 23:54 dir.zip
-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services         <==解压缩文件
-rw-rw-r--. 1 michael michael 127362 12月 21 23:42 services.zip   <==保留源目录

#指定解压缩路径,此路径可以不存在,会自动创建
[michael@admin test]$ unzip services.zip -d ./dir2
Archive:  services.zip
  inflating: ./dir2/services         
[michael@admin test]$ ll
-rw-rw-r--. 1 michael michael 127684 12月 21 23:54 dir1.zip
drwxrwxr-x. 2 michael michael   4096 12月 22 00:09 dir2           <==解压缩目录
-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services
-rw-rw-r--. 1 michael michael 127362 12月 21 23:42 services.zip
[michael@admin test]$ cd dir2                                <==进入目录后,就可以看到解压后的文件了
[michael@admin dir2]$ ll
-rw-r--r--. 1 michael michael 641020 12月 21 20:59 services

在linux下这对压缩指令用的比较少,因为压缩算法相对来说,没有gzip、bzip2、xz这些指令节省的空间多。

-------------------------------------------------------------未完待续,敬请留意----------------------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/Michael__One/article/details/85157329