第六章文件的压缩和打包

6.1 压缩打包介绍

Linux环境常见压缩文件类型:.zip,.gz,.bz2,.xz,.tar.gz,.tar.bz2,.tar.xz等,linux系统中的后缀名其实要不要无所谓,但是对于压缩文件来讲必须要带上。这是为了判断压缩文件是由哪种压缩工具所压缩,而后才能去正确的解压缩这个文件。压缩打包的目的是为了方便文件传输,节省磁盘空间,减少传输花费的时间,节省带宽等 .gz gzip 压缩工具压缩的文件 .bz2 bzip2 压缩工具压缩的文件 .tar tar 打包程序打包的文件(tar并没有压缩功能,只是把一个目录合并成一个文件) .tar.gz 可以理解为先用tar打包,然后再gzip压缩 .tar.bz2 同上,先用tar打包,然后再bzip2压缩

6.2 gzip压缩工具

gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是gzip格式的,注意:gzip不能用来压缩目录 语法: gzip [-d#] filename 其中#为1-9的数字 选项: -d:解压缩(=gunzip) -#:指定压缩等级,此处#表示1~9数字,9压缩最好,默认为6(压缩等级越高,CPU消耗越高) -c:指定压缩或解压后的路径

[root@localhost ~]# dd if=/dev/zero of=/tmp/2.txt bs=1M count=10     #用dd命创建一个10M的文件2.txt
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.0111434 秒,941 MB/秒
[root@localhost ~]# du -sh /tmp/2.txt
10M	/tmp/2.txt
[root@localhost ~]# cd /tmp
[root@localhost tmp]# gzip 2.txt                                                           #直接用gzip压缩,源文件消失,变成2.txt.gz
[root@localhost tmp]# du -sh 2.txt.gz                                                  #可以看到2.txt已经被压缩成12K
12K	2.txt.gz
[root@localhost tmp]# file 2.txt.gz                                                       #用file查看文件的类型是gzip压缩文件
2.txt.gz: gzip compressed data, was "2.txt", from Unix, last modified: Thu May 24 11:50:02 2018
[root@localhost tmp]# gzip -d 2.txt.gz                                                 #-d选项是解压用的,压缩文件消失,变成2.txt
[root@localhost tmp]# ll
总用量 10252
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 11:50 2.txt

-c指定压缩后的路径,源文件不消失

[root@localhost tmp]# gzip -c 2.txt > /tmp/2.txt.gz
[root@localhost tmp]# ll                                             #这里可以看到原来的2.txt还在
总用量 10264
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 11:50 2.txt
-rw-r--r--  1 root    root       10214 5月  24 11:57 2.txt.gz

查看压缩包内容zcat

[root@localhost tmp]# zcat 2.txt.gz      #可查看压缩包的内部内容

解压除了-d选项外,还可以使用gunzip,也可以加上-c指定解压后的路径

[root@localhost tmp]# gunzip 2.txt.gz             
gzip: 2.txt already exists; do you wish to overwrite (y or n)? y     #因为之前-c选项2.txt已经存在,会提示是否覆盖
[root@localhost tmp]# ll
总用量 10252
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 11:57 2.txt

6.3 bzip2 压缩工具

bzip2 是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法来得好。它是一款免费软件。可以自由分发免费使用。它广泛存在于UNIX&LINUX的许多发行版本中。bzip2能够进行高质量的数据压缩。它利用先进的压缩技术,能够把普通的数据文件压缩10%至15%,压缩的速度和解压的效率都非常高!支持大多数压缩格式,包括tar、gzip 等等 注意: bzip2也不可以压缩目录 语法: bzip2 [options] [filename] 选项: -d:解压缩 -z:压缩(=bzip2,所以可以不带该参数直接使用) -c:指定压缩或解压后的路径 bzip2的使用方法同gzip

[root@localhost tmp]# bzip2 2.txt              #用bzip2压缩2.txt,源文件消失,变成2.txt.bz2
[root@localhost tmp]# ll
总用量 16
drwxr-xr-x  2 root    root    4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump   68 5月  22 13:52 123.log
-rw-r--r--  1 root    root      49 5月  24 11:57 2.txt.bz2
[root@localhost tmp]# du -sh 2.txt.bz2              #可以看到压缩等级比gzip要高,之前gzip压缩后为12k,这里压缩完变成4K
4.0K	2.txt.bz2

解压可以使用-d选项或者bunzip2,这里使用bunzip2解压

[root@localhost tmp]# bunzip2 2.txt.bz2              #解压后,源文件消失,变成2.txt
[root@localhost tmp]# ll
总用量 10252
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 11:57 2.txt

-c指定解压缩后路径,源文件不消失

[root@localhost tmp]# bzip2 -c 2.txt >/tmp/2.txt.bz2         
[root@localhost tmp]# ll                                               #可以看到原来的2.txt还在
总用量 10256
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 11:57 2.txt
-rw-r--r--  1 root    root          49 5月  24 12:19 2.txt.bz2

同样可以使用bzcat查看压缩包的内容

[root@localhost tmp]# bzcat 2.txt.bz2             #查看压缩包内容

6.4 xz压缩工具

注意: xz同样不可用于压缩目录 语法: xz [options] [filename] 选项: -d:解压缩

[root@localhost tmp]# xz 2.txt             #不跟选项直接压缩,源文件消失
[root@localhost tmp]# ll
总用量 16
drwxr-xr-x  2 root    root    4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump   68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    1660 5月  24 12:19 2.txt.xz
drwxrwxrwx. 2 root    root    4096 5月   1 02:49 nfstest
-rw-------. 1 root    root       0 4月  22 00:02 yum.log
-rw-------  1 root    root       0 5月  17 01:52 yum.log.bak
[root@localhost tmp]# du -sh 2.txt.xz 
4.0K	2.txt.xz

解压可以使用-d或者unxz命令

[root@localhost tmp]# xz -d 2.txt.xz                #源文件消失,变成2.txt
[root@localhost tmp]# ll
总用量 10252
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 12:19 2.txt

-c选项同gzip和bzip2用法一样

6.5 zip压缩工具

windows下最常见的压缩格式,这里也可以用在linux下,如果没有这个命令,需要安装zip包

[root@localhost tmp]# yum install -y zip

注意: zip既可以压缩目录文件也可以压缩普通文件,源文件不消失。 语法: zip [options] [filename.zip] [filename] 说明: zip后面先跟目标文件名,也就是自定义的压缩包名,然后跟源文件名。 选项: -r:压缩目录文件时使用,表示级联压缩,连通目录内文件一同压缩

[root@localhost tmp]# zip 2.txt.zip 2.txt                #这里先指定压缩后的文件名2.txt.zip再跟要压缩的文件,源文件不消失
  adding: 2.txt (deflated 100%)
[root@localhost tmp]# ll
总用量 10264
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 12:19 2.txt
-rw-r--r--  1 root    root       10350 5月  24 12:35 2.txt.zip

压缩目录-r,连通目录内文件一同压缩

[root@localhost tmp]# zip 123.zip 123
  adding: 123/ (stored 0%)
[root@localhost tmp]# ll
总用量 10268
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root         158 5月  24 12:38 123.zip

解压

[root@localhost tmp]# unzip 2.txt.zip      
Archive:  2.txt.zip
replace 2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y                  #因为源文件不消失,2.txt已经存在,所以提示
  inflating: 2.txt                   
[root@localhost tmp]# ll
总用量 10268
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root         158 5月  24 12:38 123.zip
-rw-r--r--  1 root    root    10485760 5月  24 12:19 2.txt
-rw-r--r--  1 root    root       10350 5月  24 12:35 2.txt.zip

-d选项可以指定解压时路径

[root@localhost tmp]# unzip 2.txt.zip -d /tmp/3.txt      #因为2.txt已经存在,这里改成解压为/tmp/3.txt
Archive:  2.txt.zip
  inflating: /tmp/3.txt/2.txt        
[root@localhost tmp]# ll
总用量 10272
drwxr-xr-x  2 root    root        4096 5月  22 09:38 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root         158 5月  24 12:38 123.zip
-rw-r--r--  1 root    root    10485760 5月  24 12:19 2.txt
-rw-r--r--  1 root    root       10350 5月  24 12:35 2.txt.zip
drwxr-xr-x  2 root    root        4096 5月  24 12:43 3.txt

查看压缩文件

[root@localhost tmp]# unzip -l 2.txt.zip 
Archive:  2.txt.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
 10485760  05-24-2018 12:19   2.txt
---------                     -------
 10485760                     1 file

6.6 tar打包

语法: tar [options] [filename] 选项: -c:建立一个tar包或者压缩文件包 -f:指定目标文件名,如果多个参数组合使用时,把-f放在最后面,必加选项 -z:同时用gzip压缩 -j:同时用bzip2压缩 -J:同时用xz压缩 -t:查看包里面的文件 -v:可视化 --exclude:后面跟文件名,表示打包除了该文件之外的内容 打包目录或文件tar cvf

[root@localhost tmp]# touch 123/222.txt 123/333.txt
[root@localhost tmp]# ll 123
总用量 0
-rw-r--r-- 1 root root 0 5月  24 12:48 222.txt
-rw-r--r-- 1 root root 0 5月  24 12:48 333.txt
[root@localhost tmp]# tar cvf 123.tar 123             #先指定打包后文件名再跟打包的文件,这里比较特殊,选项可以加-或者不加-,同样
123/
123/333.txt
123/222.txt
[root@localhost tmp]# tar cvf 333.tar 123 2.txt     #同时打包多个
123/
123/333.txt
123/222.txt
2.txt

说明: 打包不会删除源文件,当某.tar文件已经存在时,再次打包会直接覆盖该文件,无任何提示。 查看包的内容 -t选项可以用来查看包的内容,-f指定查看的包

[root@localhost tmp]# tar -tvf 333.tar                  #可以看到这前的找包的123目录和目录下的文件,还有2.txt
drwxr-xr-x root/root         0 2018-05-24 12:48 123/
-rw-r--r-- root/root         0 2018-05-24 12:48 123/333.txt
-rw-r--r-- root/root         0 2018-05-24 12:48 123/222.txt
-rw-r--r-- root/root  10485760 2018-05-24 12:19 2.txt

解包tar xvf

[root@localhost tmp]# tar xvf 333.tar               #把333.tar解包,文件已经存在,会直接覆盖,不提示
123/
123/333.txt
123/222.txt
2.txt

选择性打包(--exclude)

[root@localhost tmp]# ll 123       #可以看到123目录下有222.txt和333.txt 
总用量 0
-rw-r--r-- 1 root root 0 5月  24 12:48 222.txt
-rw-r--r-- 1 root root 0 5月  24 12:48 333.txt
[root@localhost tmp]# tar cvf 123.tar --exclude 333.txt 123           #这里使用--exclude选项打包的时候把333.txt排除
123/
123/222.txt
[root@localhost tmp]# tar cvf 333.tar --exclude "*.txt" 123            #这里排除*.txt,只打包目录本身 
123/

6.7 打包并压缩

语法: tar [options] [filename] 选项: -z:同时用gzip压缩 -j:同时用bzip2压缩 -J:同时用xz压缩 打包的同时用gzip压缩 tar zcvf

[root@localhost tmp]# tar zcvf 3.tar.gz 123                           #这里先指定打包压缩后的文件名
123/
123/333.txt
123/222.txt
[root@localhost tmp]# ll
[root@localhost tmp]# ll
总用量 10260
drwxr-xr-x  2 root    root        4096 5月  24 12:48 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 12:19 2.txt
-rw-r--r--  1 root    root         142 5月  24 13:08 3.tar.gz

打包的同时用bzip2压缩 tar jcvf

[root@localhost tmp]# tar jcvf 3.tar.bz2 123
123/
123/333.txt
123/222.txt
[root@localhost tmp]# ll
总用量 10264
drwxr-xr-x  2 root    root        4096 5月  24 12:48 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 12:19 2.txt
-rw-r--r--  1 root    root         152 5月  24 13:11 3.tar.bz2
-rw-r--r--  1 root    root         142 5月  24 13:08 3.tar.gz

打包的同时用xz压缩 tar Jcvf,这里是大写J

[root@localhost tmp]# tar Jcvf 3.tar.xz 123
123/
123/333.txt
123/222.txt
[root@localhost tmp]# ll
总用量 10268
drwxr-xr-x  2 root    root        4096 5月  24 12:48 123
-rw-r--r--  1 tcpdump tcpdump       68 5月  22 13:52 123.log
-rw-r--r--  1 root    root    10485760 5月  24 12:19 2.txt
-rw-r--r--  1 root    root         152 5月  24 13:11 3.tar.bz2
-rw-r--r--  1 root    root         142 5月  24 13:08 3.tar.gz
-rw-r--r--  1 root    root         192 5月  24 13:12 3.tar.xz

解包

[root@localhost tmp]# tar zxvf 3.tar.gz                 #解包带有zip格式的包
123/
123/333.txt
123/222.txt
[root@localhost tmp]# tar jxvf 3.tar.bz2               #解包带有bzip2格式的包
123/
123/333.txt
123/222.txt
[root@localhost tmp]# tar Jxvf 3.tar.xz                #解包带有xz格式的包
123/
123/333.txt
123/222.txt

打包发送到远程主机并解包

[root@localhost tmp]# tar cvf - 123 |ssh 192.168.66.132 "cd /tmp/;tar xvf -"
123/
123/333.txt
123/222.txt
The authenticity of host '192.168.66.132 (192.168.66.132)' can't be established.
RSA key fingerprint is 2c:57:fc:93:19:b3:56:66:a7:7a:28:fa:47:5e:6e:8f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.66.132' (RSA) to the list of known hosts.
root@192.168.66.132's password: 
123/
123/333.txt
123/222.txt