运维日记013 - Linux下的压缩工具
在Windows下很多人已经习惯了用winzip或者winrar进行文件的打包压缩,而在Linux下打包和压缩通常是分开进行的。Linux下有专门的打包工具和压缩工具,压缩工具通常只能处理一个文件,而如果要处理多个文件通常要先用打包工具打包成一个文件然后再用压缩工具处理。关于打包工具tar,我们在《运维日记012》中已经探讨过了,这里我们专门说一下Linux下的压缩工具。
compress
Compress应该是资格很老的压缩工具了,你看到一些以.Z为后缀的压缩文件就是用compress压缩的。GNU开发的gzip压缩工具具备更高的压缩比,同时gzip也能解压compress压缩的.Z文件,所以后来compress就被gzip取代了。只有在一些非常古老的UNIX系统上还会使用compress,而目前主流的Linux发行版也许默认都不会安装这个软件。对于compress,你只需要知道有它,知道.Z文件是怎么来的即可。
gzip
gzip应该算是Linux里应用最广的压缩命令,有时候你还会看到gunzip这个命令,其实gunzip就是指向gzip的链接。在默认状态下,gzip压缩后会删除原始文件,并生成.gz为后缀的压缩文件。如:
$ cp /etc/hostname /tmp
$ gzip /tmp/hostname
这时我们可以看到/tmp/hostname文件不见了,而生成一个hostname.gz的文件。我们还可以用-v
参数来显示一些详细信息,诸如文件的压缩比等信息:
$ gzip -v /tmp/hostname
/tmp/hostname: -11.8% -- replaced with /tmp/hostname.gz
-t
参数可以用来检验压缩文件是否有损坏:
$ gzip -tv hostname.gz
hostname.gz: OK
我们还可以用-#
(#为1~9之间的数字)来指定压缩等级。1压缩速度最快,但压缩比最差;9最慢,但压缩比最高。默认压缩等级为6。
$ cp /etc/fstab /tmp
$ gzip -9v fstab
fstab: 40.0% -- replaced with fstab.gz
可以用-d
参数对.gz文件进行解压:
$ cd /tmp
$ gzip -d fstab.gz
同样解压完成后,压缩文件会被删除。我们能不能在压缩或者解压的时候,不删除源文件呢?可以的,使用-c
参数。-c
参数原本的作用是将处理后的数据输出到屏幕上,可以结合重定向来实现这一功能:
$ gzip -cv fstab > fstab.gz
fstab: 40.0%
$ ls -l fstab*
-rw-r--r-- 1 sailor-m sailor-m 477 9月 20 10:44 fstab
-rw-r--r-- 1 sailor-m sailor-m 310 9月 20 11:04 fstab.gz
$ gzip -dcv fstab.gz > fstab2
fstab.gz: 40.0%
$ s -l fstab*
-rw-r--r-- 1 sailor-m sailor-m 477 9月 20 10:44 fstab
-rw-r--r-- 1 sailor-m sailor-m 477 9月 20 11:06 fstab2
-rw-r--r-- 1 sailor-m sailor-m 310 9月 20 11:04 fstab.gz
如果是纯文本文件压缩后生成的.gz文件,无需解压可以之间使用zcat命令查看,如:
$ zcat /tmp/fstab.gz
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/pdc_baiibafi1 / ext4 errors=remount-ro 0 1
/dev/mapper/pdc_baiibafi3 /home ext4 defaults 0 2
bzip2
GNU后来开发了bzip2这个压缩比更高的压缩工具。Bzip2的常用用法与gzip基本相同。前面我们介绍的gzip的几个参数-c
、-v
、-d
、-#
的含义和用法与bzip2完全相同。这里我再介绍个-k
参数,表示保留(keep)原文件而不删除(否则默认情况下跟gzip一样,bzip2处理完后会删除原始文件)。如:
$ cp /etc/passwd /tmp
$ cd /tmp
$ bzip2 -kv passwd
passwd: 2.422:1, 3.303 bits/byte, 58.72% saved, 1979 in, 817 out.
$ ls -lh passwd*
-rw-r--r-- 1 sailor-m sailor-m 2.0K 9月 20 15:43 passwd
-rw-r--r-- 1 sailor-m sailor-m 817 9月 20 15:43 passwd.bz2
当然如同gzip一样,我们可以使用-c
参数和重定向实现同样目的:
$ bzip2 -cv passwd > passwd2.bz2
这两种方式的区别在于前一种方式生成的压缩文件的文件名为原文件名加上.bz2后缀,而后一种方式可以直接指定你想要的文件名,甚至可以不要.bz2后缀(当然不推荐你这样做)。这个-k
参数在gzip中也是有的,功能和用法一样。
bzip2命令还有一个-z
参数,它跟-d
参数对应,用于显式指定压缩,默认情况下可缺省。而gzip没有这个参数。
如果是纯文本文件用bzip2压缩后,可以用bzcat命令直接查看而无需先解压:
$ bzcat passwd.bz2