admin管理员组文章数量:1660199
Linux 之旅 6:压缩、打包和备份
常见的压缩指令
常见的压缩文件与对应的压缩程序的关系:
压缩文件 | 压缩程序 |
---|---|
*.z | compress |
*.zip | zip |
*.gz | gzip |
*.bz2 | bzip2 |
*.xz | xz |
*.tar | tar |
*.tar.gz | tar–>gzip |
*.tar.bz2 | tar–>bzip2 |
*.tar.xz | tar–>xz |
需要注意的是其中tar
只是一个打包程序,可以把多个目录结构和所包含的文件打包成一个文件,但是并不会进行压缩,一般是将tar
和其它一种压缩程序结合起来使用,所以上边的tar-->gzip
表示用tar
打包后使用gzip
压缩,这个意思。
其次,在Linux中文件后缀名与具体用什么程序打开文件并没有直接关系,这里的后缀名*.z
等仅是为了方便用户进行直观区分而约定的方式。当然你最要沿用这种约定来命名相关压缩后的文件,不要特立独行。
最后要说明的是,目前Linux上常用的压缩应用为gzip
、bzip2
以及xz
,它们的压缩率是逐渐提升的,但压缩速度是逐渐下降的(高压缩率自然意味着更长的压缩时间),而compress
是一个早期的压缩工具,已经不怎么使用了。
gzip
gzip
是一个使用广泛的压缩应用,并且还支持compress
、zip
等其它软件产生的压缩文件,其一开始开发的目标是代替老式的compress
命令。
使用gzip
产生的压缩文件一般使用*.gz
来命名。
实际使用一下:
[icexmoon@xyz tmp]$ cp /etc/services .
[icexmoon@xyz tmp]$ ls -alh services
-rw-r--r--. 1 icexmoon icexmoon 655K 8月 11 16:32 services
[icexmoon@xyz tmp]$ gzip -v services
services: 79.7% -- replaced with services.gz
[icexmoon@xyz tmp]$ ls -alh /etc/services ./services*
-rw-r--r--. 1 root root 655K 6月 7 2013 /etc/services
-rw-r--r--. 1 icexmoon icexmoon 133K 8月 11 16:32 ./services.gz
在压缩的时候使用-v
可以输出过程数据,可以看到这里压缩率有79.7%
,非常厉害。使用ls
对比压缩前后的文件大小也能看到压缩比很惊人。
此外,需要特别注意的是,在默认情况下gzip
对源文件压缩完以后,原文件会被删除,这点和Windows下的压缩工具是不同的,当然可以使用一些参数保留原文件,比如这样:
[icexmoon@xyz tmp]$ cp /etc/services .
[icexmoon@xyz tmp]$ gzip services -c > service2.gz
[icexmoon@xyz tmp]$ ls -al /etc/services ./service*
-rw-r--r--. 1 root root 670293 6月 7 2013 /etc/services
-rw-rw-r--. 1 icexmoon icexmoon 136088 8月 11 16:40 ./service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 8月 11 16:39 ./services
-rw-r--r--. 1 icexmoon icexmoon 136088 8月 11 16:32 ./services.gz
虽然gzip
并没有直接保留原文件的选项,但是通过-c
可以将压缩结果输出到屏幕,并且保留原文件,而我们只需要使用重定向符号>
将流重定向到文件service2.gz
即可。
因为gzip
是一个文本文件,我们甚至可以在不解压的情况下使用其它命令来查看该文件,比如zcat
:
[icexmoon@xyz tmp]$ zcat services.gz | head -n 10
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
类似的,还可以进行检索特定字符串:
[icexmoon@xyz tmp]$ zgrep -n http services.gz | head -n 10
14:# http://www.iana/assignments/port-numbers
89:http 80/tcp www www-http # WorldWideWeb HTTP
90:http 80/udp www www-http # HyperText Transfer Protocol
91:http 80/sctp # HyperText Transfer Protocol
197:https 443/tcp # http protocol over TLS/SSL
198:https 443/udp # http protocol over TLS/SSL
199:https 443/sctp # http protocol over TLS/SSL
210:gss-http 488/tcp
211:gss-http 488/udp
555:webcache 8080/tcp http-alt # WWW caching service
这里-n
参数是给结果标注行号。zgrep
和grep
的参数用法是完全一样的,zcat
也和cat
类似,看起来我们只要给常用的操作文本文件的命令前加上一个z
就可以变成针对gzip
压缩后的文本文件的命令,这样的命令还有zmore
、zless
等。
还需要说明的是gzip
的压缩分为1~9个压缩等级,压缩等级越高就表明压缩比越高,压缩后的文件也越小,默认的压缩等级是6,一般来说就够用了,更高压缩等级也意味着更长的处理时间,如果你的确需要一个更高的压缩比,可以这样:
[icexmoon@xyz tmp]$ gzip -9 -vc /etc/services > services3.gz
/etc/services: 79.8%
[icexmoon@xyz tmp]$ ls -al service*
-rw-rw-r--. 1 icexmoon icexmoon 136088 8月 11 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 8月 11 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 135489 8月 11 16:53 services3.gz
-rw-r--r--. 1 icexmoon icexmoon 136088 8月 11 16:32 services.gz
可以看到service3.gz
的确是更小了,但也小的有限。压缩算法本来就是个很看具体情况的东西,所以具体提高压缩等级能榨出多少油水取决于你的压缩算法和目标文件。
最后要说的就是解压了:
[icexmoon@xyz tmp]$ gzip -d services3.gz
[icexmoon@xyz tmp]$ ls -al service*
-rw-rw-r--. 1 icexmoon icexmoon 136088 8月 11 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 8月 11 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 16:53 services3
-rw-r--r--. 1 icexmoon icexmoon 136088 8月 11 16:32 services.gz
使用参数-d
(decompress)可以解压缩,可以看到压缩文件services3.gz
被解压成了service3
。
与压缩一样,默认情况下gzip
解压后会删除原压缩文件,这点需要注意。
bzip2
bzip2
的功能和用法都与gzip
类似,不过拥有更高的压缩比。此外bzip2
产生的压缩文件一般使用*.bz2
进行命名。
我们看具体案例:
[icexmoon@xyz tmp]$ bzip2 services -cv > services4.bz2
services: 5.409:1, 1.479 bits/byte, 81.51% saved, 670293 in, 123932 out.
[icexmoon@xyz tmp]$ ls -al service*
-rw-rw-r--. 1 icexmoon icexmoon 136088 8月 11 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 8月 11 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 16:53 services3
-rw-rw-r--. 1 icexmoon icexmoon 123932 8月 11 17:05 services4.bz2
-rw-r--r--. 1 icexmoon icexmoon 136088 8月 11 16:32 services.gz
可以看到压缩比的确要高于gzip
,甚至比gzip
最高压缩级别压缩后的文件都要小。
同样,我们可以在不解压的情况下查看文件内容:
[icexmoon@xyz tmp]$ bzcat services4.bz2 | head -n 10
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
类似的,也可以使用bzip2
解压:
[icexmoon@xyz tmp]$ bzip2 -d services4.bz2
[icexmoon@xyz tmp]$ ls -al service*
-rw-rw-r--. 1 icexmoon icexmoon 136088 8月 11 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 8月 11 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 16:53 services3
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 17:05 services4
-rw-r--r--. 1 icexmoon icexmoon 136088 8月 11 16:32 services.gz
xz
xz
有着比bzip2
更高的压缩比,其一般产生的压缩文件使用*.xz
进行命名。
实际测试:
[icexmoon@xyz tmp]$ xz -cv services > services5.xz
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149
[icexmoon@xyz tmp]$ ls -al service*
-rw-rw-r--. 1 icexmoon icexmoon 136088 8月 11 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 8月 11 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 16:53 services3
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 17:05 services4
-rw-rw-r--. 1 icexmoon icexmoon 123932 8月 11 17:08 services4.bz2
-rw-rw-r--. 1 icexmoon icexmoon 99608 8月 11 17:12 services5.xz
-rw-r--r--. 1 icexmoon icexmoon 136088 8月 11 16:32 services.gz
可以看到xz
的压缩率的确惊人,但这也可能消耗过长的时间。
同样的,可以不解压直接查看文件内容:
[icexmoon@xyz tmp]$ xzcat services5.xz | head -n 10
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
甚至可以查看解压前后的大小:
[icexmoon@xyz tmp]$ xzcat -l services5.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 97.3 KiB 654.6 KiB 0.149 CRC64 services5.xz
解压:
[icexmoon@xyz tmp]$ xz -d services5.xz
[icexmoon@xyz tmp]$ ls -al service*
-rw-rw-r--. 1 icexmoon icexmoon 136088 8月 11 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 8月 11 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 16:53 services3
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 17:05 services4
-rw-rw-r--. 1 icexmoon icexmoon 123932 8月 11 17:08 services4.bz2
-rw-rw-r--. 1 icexmoon icexmoon 670293 8月 11 17:12 services5
-rw-r--r--. 1 icexmoon icexmoon 136088 8月 11 16:32 services.gz
关于这三种压缩应用的选择,需要具体情况具体判断,如果极为重视压缩率,而不怎么关心时间消耗,可以使用xz
,并选择最高压缩等级,但如果比较关心时间消耗,就可以选择gzip
。
tar
如果是开发者,肯定明白“打包”是怎么一回事,发布程序的时候总是要把工程目录下的所有文件打成一个包再发布,当然,往往还会设置一些排除目录和文件,而tar
命令就可以做这个事。
前边说了,tar
往往还会结合前边介绍的压缩程序,再打包的同时进行压缩。
主要参数
tar
命令主要包含以下参数:
- 运行模式:
-c
:创建压缩文件-t
:查看压缩文件的内容-x
:解压缩
- 所用的压缩程序:
-z
:使用gzip
进行压缩/解压缩-j
:使用bzip2
进行压缩/解压缩-J
:使用xz
进行压缩/解压缩
- 其它:
-v
:显式运行过程信息-f filename
:需要被处理的压缩文件-C 目录
:解压时候输出的目录-p
(小写):压缩时候保留数据的权限与属性,常用于备份配置文件-P
(大写):保留绝对路径
这些参数主要分为三组,第一组用于确定你的执行目的,是要创建压缩文件还是查看压缩文件内容,抑或是解压缩,这三种模式在同一时间只能选一种。第二组是指定压缩/解压缩过程中需要使用的压缩程序,第三组是一些其它的参数。
压缩、查看和解压
我们来看实际效果:
[root@xyz ~]# time tar -cpzv -f /tmp/etc.tar.gz /etc
tar: 从成员名中删除开头的“/”
/etc/
/etc/fstab
/etc/crypttab
/etc/mtab
/etc/resolv.conf
/etc/fonts/
/etc/fonts/conf.d/
/etc/fonts/conf.d/62-google-crosextra-caladea-fontconfig.conf
...省略中间数据...
/etc/scl/conf
/etc/scl/prefixes/
real 0m7.475s
user 0m2.869s
sys 0m2.338s
[root@xyz ~]# ls -al /tmp/etc.tar.gz
-rw-r--r--. 1 root root 12316549 8月 11 20:43 /tmp/etc.tar.gz
版权声明:本文标题:Linux 之旅 6:压缩、打包和备份 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729855761a1215558.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论