17、Linux 文件压缩与解压
一、压缩和解压缩
由于以前的计算机磁盘容量比较小,业内人士绞尽脑汁,终于开发出了一个能帮助用户节省磁盘的工具,就是压缩工具,我们知道计算机在存储数据的时候都是使用 bytes来计算的,但是实际上 1byte = 8bits,在日常使用中并不是所有的数据都能把这个 1byte 用完,有的可能用了三个 bits,有的可能用了四个 bits,而他们的 实际占用空间是 2bytes = 16bits,剩余的空间就浪费了,压缩工具就是通过算法,将占用三个bits的数据和占用四个bits的数据放在一个byte里,这样我们就能节省出来1byte,这种空间的节省,当你在压缩一个包含了很多文本文件的目录时是非常明显的。其实就像没有人知道早高峰的公交车里有多少人一样,一个人理论上占用的公交车内的空间,跟实际占用的空间,往往有很大差别,因为挤挤总能上去的。
压缩文件的好处有如下几点:
- 文件更小,便于网络传输,效率高;
- 避免杂乱,可以减少文件个数,多个文件一起压缩;
- 有些文件不能直接传输,比如安装程序,压缩后就可以传输了
二、linux 都出现了以下这些格式的压缩文件
- *.Z 使用 compress 压缩的文件
- *.zip 使用 zip 压缩的文件
- *.gz 使用 gzip 压缩
- *.bz2 使用 bzip2 压缩
- *.xz 使用 xz 压缩
- *.tar 使用 tar 工具打包,没有压缩
- *.tar.gz 使用 tar 工具打包,经过 gzip压缩(常用)
- *.tar.bz2 使用 tar 工具打包,经过 bzip2压缩(常用)
- *.tar.xz 使用 tar 工具打包,经过 xz 压缩
compress 已经过时了,因为太老,个别版本的 linux 已经不支持了,linux 下的压缩工具还是以 gzip和 bzip2 以及后加入的 xz 作为主力,但是由于这些工具,最早不能压缩目录,只能针对单一文件进行压缩,所以在日常使用中,他们都是配合着 tar 这个打包工具,由 tar 把目录中的很多文件打包成一个文件,再经由对应的工具进行压缩,所以我们会看上面的那些tar.*的压缩包。
三、压缩工具的使用
压缩比率:把原始文件压缩后,占用的磁盘空间和原文件的比率称压缩比率。
注意:压缩比例越小,压缩效果越好,压缩时间越长。
3.1、gzip
[root@long90 workdir]# gzip -h
Usage: gzip [OPTION]... [FILE]...-c 保留源文件 -d 解压缩-h 显示帮助-t 检查压缩文件的数据一致性,用来确定压缩文件是否有错误-v 显示压缩包的相关信息,包括压缩比等-V 显示版本号-1 压缩最快,压缩比低-9 压缩最慢,压缩比高
实例:
[root@long90 workdir]# cp /etc/services ./
[root@long90 workdir]# ls
hello_linux services
[root@long90 workdir]# gzip -v services
services: 79.4% -- replaced with services.gz # 压缩比例 = 100% - 79.4%
[root@long90 workdir]# ll -h /etc/services services.gz
-rw-r--r--. 1 root root 677K 5月 15 2020 /etc/services
-rw-r--r-- 1 root root 140K 11月 25 09:46 services.gz
# 由于service文件本来就是一个文本文档,所以还可以使用zcat,zmore,zless去查看内容
[root@long90 workdir]# zcat services.gz
cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998/tcp # Capture handwritten signatures
[root@long90 workdir]# gzip -d services.gz
[root@long90 workdir]# ls
hello_linux services[root@long90 workdir]# gzip -1 -c services > services1.gz
[root@long90 workdir]# gzip -9 -c services > services2.gz
[root@long90 workdir]# ll -h
总用量 980K
-rw-r--r--. 1 root root 0 11月 23 00:48 hello_linux
-rw-r--r-- 1 root root 677K 11月 25 09:46 services
-rw-r--r-- 1 root root 160K 11月 25 10:08 services1.gz
-rw-r--r-- 1 root root 139K 11月 25 10:09 services2.gz[root@long90 workdir]# zgrep -n ssh services1.gz
44:ssh 22/tcp # The Secure Shell (SSH) Protocol
45:ssh 22/udp # The Secure Shell (SSH) Protocol
551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset
593:ssh 22/sctp # SSH
1351:sshell 614/tcp # SSLshell
1352:sshell 614/udp # SSLshell
1607:netconf-ssh 830/tcp # NETCONF over SSH
1608:netconf-ssh 830/udp # NETCONF over SSH
7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH
7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH
7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH)
8473:snmpssh 5161/tcp # SNMP over SSH Transport Model
8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model
9126:tl1-ssh 6252/tcp # TL1 over SSH
9127:tl1-ssh 6252/udp # TL1 over SSH
10796:ssh-mgmt 17235/tcp # SSH Tectia Manager
10797:ssh-mgmt 17235/udp # SSH Tectia Manager
3.2、bzip2
[root@long90 workdir]# bzip2 -h-h 帮助-d 解压-z 压缩 默认值-k 保留源文件-v 查看版本信息-1 ..-9 同gzip相同
bzip2 的使用与gzip相同,两种工具的区别就是压缩算法不同,bzip2的压缩比更好一些,bzip的包查看的时候使用的是 bzcat,bzmore,bzless,bzgrep 同gzip用法相同
[root@long90 workdir]# gzip -c services > services0.gz
[root@long90 workdir]# bzip2 -k services
[root@long90 workdir]# ll -h
总用量 948K
-rw-r--r--. 1 root root 0 11月 23 00:48 hello_linux
-rw-r--r-- 1 root root 677K 11月 25 09:46 services
-rw-r--r-- 1 root root 140K 11月 25 10:19 services0.gz
-rw-r--r-- 1 root root 127K 11月 25 09:46 services.bz2
3.3、xz
虽然 bzip2 的压缩效果相对比 gzip 已经提升很多,但是技术是永无止境的,于是出现了 xz,它的用法跟 gzip和 bzip2一样
[root@long90 workdir]# xz -h-d 解压缩-t 检查压缩文件的完整性-l 查看压缩文件的相关信息-k 保留源文件-c 将信息输出到显示器上-0 ... -9 指定压缩级别-h 显示帮助
[root@long90 workdir]# xz -k services
[root@long90 workdir]# ll -h
总用量 1.1M
-rw-r--r--. 1 root root 0 11月 23 00:48 hello_linux
-rw-r--r-- 1 root root 677K 11月 25 09:46 services
-rw-r--r-- 1 root root 140K 11月 25 10:19 services0.gz
-rw-r--r-- 1 root root 127K 11月 25 09:46 services.bz2
-rw-r--r-- 1 root root 104K 11月 25 09:46 services.xz
[root@long90 workdir]# time gzip -c services > services.gz
real 0m0.026s
user 0m0.017s
sys 0m0.009s
[root@long90 workdir]# time bzip2 -k services
real 0m0.063s
user 0m0.052s
sys 0m0.010s
[root@long90 workdir]# time xz -k services
real 0m0.368s
user 0m0.347s
sys 0m0.020s
我们可以使用 time 这个命令去对比一下时间 gzip,bzip2,xz 的时间分别是 0.026s,0.063s,0.368s,可以看到 xz 所使用的时间是比较长的,而这个时间会跟文件体积成正比,所以这三种压缩方式大家在使用的时候也要把时间成本考虑在内,除非你很富有。
3.4、tar
大多数压缩工具只能针对单一文件进行操作,如果你要压缩目录的话就会很麻烦,这时候我们可以使用 tar 这个打包工具,将目录内的多个文件打包成一个文件,再进行压缩。
[root@long90 workdir]# tar --help
用法: tar [选项...] [FILE]...-C 解压到指定目录-c 建立tar包-t 查看tar包内的文件-x 解压tar包-p 不修改文件属性-f 指定文件名称-j 使用 bzip2 算法-J 使用 xz算法-z 使用 gzip 算法-P 允许压缩路径中包含有"/"-v 显示详细信息-?, --help 查看帮助--exclude 压缩过程中排除指定的文件
实例:打包压缩 /etc
[root@long90 workdir]# tar -czf etc.tar.gz /etc
[root@long90 workdir]# ls
etc.tar.gz hello_linux services services.bz2 services.gz services.xz
[root@long90 workdir]# tar xf etc.tar.gz
[root@long90 workdir]# ls
etc etc.tar.gz hello_linux services services.bz2 services.gz services.xz
[root@long90 workdir]# tar tf etc.tar.gz
etc/nvme/hostnqn
etc/nvme/hostid
etc/man_db.conf
etc/nanorc
etc/locale.conf
# 查看 *.tar.gz 中包含哪些文件
[root@long90 workdir]# tar -tvf etc.tar.gz | more
drwxr-xr-x root/root 0 2022-11-25 09:30 etc/
lrwxrwxrwx root/root 0 2022-11-23 00:35 etc/mtab -> ../proc/self/mounts
-rw-r--r-- root/root 624 2022-11-24 09:36 etc/fstab
...
# 查找 *.tar.gz 中是否包含 shadow 文件或文件夹
[root@long90 workdir]# tar -tvf etc.tar.gz | grep shadow
-rw-r--r-- root/root 214 2022-06-04 07:11 etc/pam.d/sssd-shadowutils
---------- root/root 855 2022-11-24 20:41 etc/gshadow
---------- root/root 849 2022-11-24 20:41 etc/gshadow-
---------- root/root 1409 2022-11-24 20:59 etc/shadow-
---------- root/root 1404 2022-11-24 21:02 etc/shadow
[root@long90 workdir]# rm -rf etc
# 解压 *.tar.gz 中指定的文件。
[root@long90 workdir]# tar -xf etc.tar.gz etc/gshadow
[root@long90 workdir]# ls etc
gshadow