Linux 之旅 6:压缩、打包和备份

本文详细介绍了Linux系统中常用的压缩命令gzip、bzip2和xz,以及打包工具tar的使用方法,包括压缩、解压缩、查看内容、备份和恢复。此外,还讨论了SFX文件系统的备份与还原,以及dd和cpio等其它备份工具的应用。在选择压缩工具时,需要根据压缩率和时间消耗进行权衡。
摘要由CSDN通过智能技术生成

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上常用的压缩应用为gzipbzip2以及xz,它们的压缩率是逐渐提升的,但压缩速度是逐渐下降的(高压缩率自然意味着更长的压缩时间),而compress是一个早期的压缩工具,已经不怎么使用了。

gzip

gzip是一个使用广泛的压缩应用,并且还支持compresszip等其它软件产生的压缩文件,其一开始开发的目标是代替老式的compress命令。

使用gzip产生的压缩文件一般使用*.gz来命名。

实际使用一下:

[icexmoon@xyz tmp]$ cp /etc/services .
[icexmoon@xyz tmp]$ ls -alh services
-rw-r--r--. 1 icexmoon icexmoon 655K 811 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 67 2013 /etc/services
-rw-r--r--. 1 icexmoon icexmoon 133K 811 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 67 2013 /etc/services
-rw-rw-r--. 1 icexmoon icexmoon 136088 811 16:40 ./service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 811 16:39 ./services
-rw-r--r--. 1 icexmoon icexmoon 136088 811 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.org/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参数是给结果标注行号。zgrepgrep的参数用法是完全一样的,zcat也和cat类似,看起来我们只要给常用的操作文本文件的命令前加上一个z就可以变成针对gzip压缩后的文本文件的命令,这样的命令还有zmorezless等。

还需要说明的是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 811 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 811 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 135489 811 16:53 services3.gz
-rw-r--r--. 1 icexmoon icexmoon 136088 811 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 811 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 811 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 16:53 services3
-rw-r--r--. 1 icexmoon icexmoon 136088 811 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 811 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 811 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 16:53 services3
-rw-rw-r--. 1 icexmoon icexmoon 123932 811 17:05 services4.bz2
-rw-r--r--. 1 icexmoon icexmoon 136088 811 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 811 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 811 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 16:53 services3
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 17:05 services4
-rw-r--r--. 1 icexmoon icexmoon 136088 811 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 811 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 811 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 16:53 services3
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 17:05 services4
-rw-rw-r--. 1 icexmoon icexmoon 123932 811 17:08 services4.bz2
-rw-rw-r--. 1 icexmoon icexmoon  99608 811 17:12 services5.xz
-rw-r--r--. 1 icexmoon icexmoon 136088 811 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 811 16:40 service2.gz
-rw-r--r--. 1 icexmoon icexmoon 670293 811 16:39 services
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 16:53 services3
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 17:05 services4
-rw-rw-r--. 1 icexmoon icexmoon 123932 811 17:08 services4.bz2
-rw-rw-r--. 1 icexmoon icexmoon 670293 811 17:12 services5
-rw-r--r--. 1 icexmoon icexmoon 136088 811 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 811 20:43 /tmp/etc.tar.gz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值