压缩与解压
gzip
gzip是linux上应用最广泛的压缩指令,它创建的压缩文件后缀名为.gz
用法:
gzip [选项] 文件名
常用选项:
- -c: 打印压缩后到内容
- -d: 解压缩
- -v: 显示出压缩比等信息
- -数字: 压缩等级,-1表示最快但是压缩比最差,-9表示最慢但是压缩比最好,默认为-6
演示
将 /etc/services 拷贝到当前目录,压缩并打印压缩比信息
[yousiku@localhost ~]$ cp /etc/services .
[yousiku@localhost ~]$ ls
services
[yousiku@localhost ~]$ gzip -v services
services: 79.7% -- replaced with services.gz
[yousiku@localhost ~]$ ls
services.gz
可以看到,使用gzip
会直接将原文件压缩为.gz
文件。
若想要将.gz
压缩文件解压,可以加上-d
选项:
[yousiku@localhost ~]$ gzip -d services.gz
[yousiku@localhost ~]$ ls
services
而在上一步中我们发现直接使用gzip
指令压缩文件后原文件不会保留,若想要在压缩时保留原文件可以这样:
[yousiku@localhost ~]$ gzip -c services > services.gz
[yousiku@localhost ~]$ ls
services services.gz
加-c
选项是打印压缩后的文件内容,而>
符号表示将要打印的内容重定向到service.gz文件中,因此压缩后到内容就保存在了service.gz中
试试不同的压缩等级:
[yousiku@localhost ~]$ gzip -1vc services > service1.gz
services: 76.6%
[yousiku@localhost ~]$ gzip -9vc services > service9.gz
services: 79.8%
可以看到使用-9
选项的压缩比更高(压缩比是指压缩后减少的文件大小比原文件大小),但是在压缩速度上要慢些
如果想要不将压缩文件解压直接查看文件内容,使用cat
是不行的,这样会得到解压后的内容,显示为乱码。这时我们可以使用zcat
命令就可以直接查看压缩文件原来的内容了:
[yousiku@localhost ~]$ zcat service1.gz
xz
xz与gzip相比拥有更高的压缩比,但是在压缩速度上会慢不少。通过xz压缩的文件名后缀为.xz
用法
xz [选项] 文件名
常用选项
- -d: 解压缩
- -v: 列出压缩比信息
- -k: 保留原文件
- -c: 打印压缩内容
- -数字: 压缩等级,-1表示最快但是压缩比最差,-9表示最慢但是压缩比最好,默认为-6
演示
直接压缩并打印压缩比信息
[yousiku@localhost ~]$ xz -v services
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149
[yousiku@localhost ~]$ ls
service1.gz service9.gz services.xz
services 被压缩成了services.xz,并且可以看到通过xz命令压缩文件的压缩比为1-0.149=85.1%
,压缩比较gzip指令高不少,但是速度会慢很多
解压:
[yousiku@localhost ~]$ xz -d services.xz
打包指令:tar
前面提到的gzip
和xz
只能对单一的文件压缩,但在实际使用过程中我们常常需要对整个目录打包成一个大文件一起压缩,tar
指令即可实现这样的功能,不仅于此,它还能在打包的同时将打包文件压缩成各种格式的压缩文件,包括.gz
与.xz
常用选项
- -c: 创建打包文件
- -t: 查看打包后的文件里有哪些文件名
- -x: 解打包或解压缩
- -z: 通过
gzip
压缩或解压缩,此时建议指定压缩后文件后缀为.tar.gz
- -J: 通过
xz
压缩或解压缩,此时建议指定压缩后文件后缀为.tar.xz
- -f: 要打包压缩生成或解压解包的文件名
- -C: 在特定的目录解压缩
用法
tar [选项] -f [打包或压缩后到文件名] [要打包的目录]
演示
将/etc
打包到当前目录的etc.tar
文件(由于打包/etc
需要root权限,因此先切换到root账户):
[yousiku@localhost ~]$ su -
密码:
上一次登录:四 11月 29 22:44:31 CST 2018pts/0 上
[root@localhost ~]# tar -c -f ./etc.tar /etc
tar: 从成员名中删除开头的“/”
[root@localhost ~]# ls
anaconda-ks.cfg etc.tar
此时生成的etc.tar
文件并没有经过压缩
分别按gzip
方式和xz
方式打包压缩:
[root@localhost ~]# tar -zc -f ./etc.tar.gz /etc
tar: 从成员名中删除开头的“/”
[root@localhost ~]# tar -Jc -f ./etc.tar.xz /etc
tar: 从成员名中删除开头的“/”
[root@localhost ~]# ll
总用量 44000
-rw-------. 1 root root 1257 10月 20 07:01 anaconda-ks.cfg
-rw-r--r--. 1 root root 28313600 11月 29 22:50 etc.tar
-rw-r--r--. 1 root root 9787847 11月 29 22:59 etc.tar.gz
-rw-r--r--. 1 root root 6943872 11月 29 22:59 etc.tar.xz
可以看到,生成的文件中etc.tar
由于没有经过压缩所以最大,而etc.tar.gz
和etc.tar.xz
经过压缩后体积较etc.tar
小很多
直接查看打包文件里面包含的文件名:
[root@localhost ~]# tar -t -f etc.tar.xz
解包出etc
目录到当前目录:
[root@localhost ~]# tar -x -f etc.tar.gz
[root@localhost ~]# ls
anaconda-ks.cfg etc etc.tar etc.tar.gz etc.tar.xz
若想仅仅将打包文件中的其中一个文件解包出来可以用如下用法:
tar -x -f [打包文件] [待解包的文件]
如,将etc.tar.gz
中的etc/shadow
文件解包出来(这里先将上一步解包出的etc
目录删除否则目录冲突):
[root@localhost ~]# rm -rf etc
[root@localhost ~]# tar -x -f etc.tar.gz etc/shadow
[root@localhost ~]# ls
anaconda-ks.cfg etc etc.tar etc.tar.gz etc.tar.xz
[root@localhost ~]# ls etc
shadow
这样解包出的etc
目录下就只有shadow
文件了
目前我们经常要从网上下载的软件包大都是后缀名为.tar.gz
的形式,而如果用gzip
解压的话得到的是.tar
文件,这样就还需要用tar
解包;但是使用tar -x
命令可以一步到位直接将.tar.gz
文件解压解包出来,可以说tar
指令在文件压缩打包的用途最为广泛!