Linux命令之压缩文件(gzip、bzip2、xz)

本文将会学到的命令

  1. gzip
  2. bzip2
  3. xz

文件压缩的原理

目前我们使用的计算机系统都是使用所谓的bytes单位来计量的,不过事实上,计算机最小的计量单位应该是bits才对。此外,我们知道1 byte = 8 bits。但是,如果今天我们只是记忆一个数字 1 ,电脑会如何记录呢,由于 1 byte = 8 bits,所以每个byte当中会有8个空格,而每个空格可以是0,1,由于我们记录的数字是1,考虑计算机所谓的二进制,如此一来,1会在最右边占据1个bit,而其他的7个bits将会自动的被填上0,其实那7个bits应该是空的才对,不过,为了满足目前我们的操作系统数据的存取,所以就会将该数据转为byte的形态来记录。而一些聪明的计算机工程师就利用一些复杂的计算方式,将这些没有用到的空间丢出来,以让文件占用的空间变小,这就是压缩的技术

另外一种压缩技术是将重复的数据进行统计记录。举例来说,如果数据为[1111…]共有100个1时,那么压缩技术就会记录为“100个1”而不是真的有100个1的位存在,这样也能够精简文件的大小。

简单来说,就是文件里面有很多没有使用的空间存在,并不是完全填满的,而压缩的技术就是将这些空间填满,以让整个文件占用的大小下降。

不过这些压缩过的文件并不能被操作系统直接使用,因此,若要使用这些被压缩过的文件数据,则必须将他还原回未压缩前的模样,这就是所谓的解压缩

压缩后与压缩的文件所占用的磁盘空间大小,就可以被称为压缩比

压缩操作最大的好处就是压缩过的文件容量变小了

常见的压缩指令

由于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压缩过

##gzip ,zcat/zmore/zless/zgrep

gzip可以解开compress,zip与gzip等软件所压缩的文件。至于gzip所建立的压缩文件为*.gz的文件名。

gzip命令的常用参数如下:

  • -c:将压缩的数据输出到屏幕上,可透过数据流重导向来处理
  • -d:解压缩的参数
  • -t:可以用来检验一个压缩文件的一致性,看看文件有没有错误
  • -v:可以显示出原文件/压缩文件的压缩比等信息
  • -#:#是数字的意思,代表压缩等级,-1最快,但是压缩比最差,-9最慢,但是压缩比最好,预设是-6

以下是gzip的使用示例

#1.找出/etc底下(不含子目录)容量最大的文件,并将它复制到/tmp,然后以gzip压缩
[test@fgr ~]$ ls -ldSr /etc/*
。。。
-rw-r--r--.  1 root root    51787 5月  15 2013 /etc/mime.types
-rw-r--r--.  1 root root    91171 4月  19 15:05 /etc/ld.so.cache
-rw-r--r--.  1 root root   670293 6月   7 2013 /etc/services
[test@fgr ~]$ cd /tmp
[test@fgr tmp]$ cp /etc/services .
[test@fgr tmp]$ gzip -v services
services:        79.7% -- replaced with services.gz
[test@fgr tmp]$ ll /etc/services /tmp/services*
-rw-r--r--. 1 root root 670293 6月   7 2013 /etc/services
-rw-r--r--. 1 test test 136088 4月  19 18:44 /tmp/services.gz

当使用gzip进行压缩时,在默认情况下原本的文件会被压缩为.gz的文件名,原文件就不在存在了。

#2.由于services是文本文件,所以可以使用zcat、zmore、zless、zgrep读取其中的内容
[test@fgr tmp]$ zless services.gz 
# /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
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
#       http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name  port/protocol  [aliases ...]   [# comment]

tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
systat          11/udp          users
daytime         13/tcp
daytime         13/udp
qotd            17/tcp          quote
qotd            17/udp          quote
msp             18/tcp                          # message send protocol (historic)
msp             18/udp                          # message send protocol (historic)
chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source
ftp-data        20/tcp
ftp-data        20/udp
# 21 is registered to ftp, but also used by fsp
ftp             21/tcp
ftp             21/udp          fsp fspd
ssh             22/tcp                          # The Secure Shell (SSH) Protocol
ssh             22/udp                          # The Secure Shell (SSH) Protocol
telnet          23/t
#3.将services.gz解压缩
[test@fgr tmp]$ gzip -d services.gz 
#与gzip相反,gzip -d 会将原本的.gz删除,恢复到原本的services文件
#4.使用最佳压缩比压缩services 并且保留原文件
[test@fgr tmp]$ gzip -9 -c services > services.gz
#5.在services.gz中找出http这个关键字在哪几行
[test@fgr tmp]$ zgrep -n 'http' services.gz 
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
。。。

在第四个示例中,重点在于-c与>的使用,-c可以将原本要转成压缩文件的资料内容变成文字类型从屏幕输出,然后通过>符号,将原本应该由屏幕输出的数据,转成输出到文件,所以就能够建立出压缩文件了。只是文件名要自己写。

bzip2,bzcat/bzmore/bzless/bzgrep

bzip2的压缩比比gzip还要好,使用方法也和gzip差不多。

下面看一下bzip2的常用参数:

  • -c:将压缩的数据输出到屏幕上,可透过数据流重导向来处理
  • -d:解压缩的参数
  • -k:保留原文件,而不会删除原始文件
  • -z:研所的参数(默认值,可以不加)
  • -v:可以显示出原文件/压缩文件的压缩比等信息
  • -#:#是数字的意思,代表压缩等级,-1最快,但是压缩比最差,-9最慢,但是压缩比最好,预设是-6

以下是bzip2的使用示例:

#1.压缩/tmp/services
[test@fgr tmp]$ bzip2 -v services
  services:  5.409:1,  1.479 bits/byte, 81.51% saved, 670293 in, 123932 out.
[test@fgr tmp]$ ls -l services*
-rw-r--r--. 1 test test 123932 4月  19 18:44 services.bz2
-rw-rw-r--. 1 test test 135489 4月  19 18:56 services.gz
#可以看到bzip2的压缩比81%比gzip的79%要高
#2.读取services.bz2的内容
[test@fgr tmp]$ bzmore services.bz2 
------> services.bz2 <------
# /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
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
#       http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name  port/protocol  [aliases ...]   [# comment]

tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
systat          11/udp          users
daytime         13/tcp
daytime         13/udp
qotd            17/tcp          quote
qotd            17/udp          quote
msp             18/tcp                          # message send protocol (historic)
msp             18/udp                          # message send protocol (historic)
chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source
ftp-data        20/tcp
ftp-data        20/udp
# 21 is registered to ftp, but also used by fsp
ftp             21/tcp
ftp             21/udp          fsp fspd
ssh             22/tcp                          # The Secure Shell (SSH) Protocol
ssh             22/udp                          # The Secure Shell (SSH) Protocol
telnet          23/tcp
#3.解压缩services.bz2
[test@fgr tmp]$ bzip2 -d services.bz2 
[test@fgr tmp]$ ls -l services*
-rw-r--r--. 1 test test 670293 4月  19 18:44 services
-rw-rw-r--. 1 test test 135489 4月  19 18:56 services.gz
#4.以最佳压缩比压缩services,并保留原文件
[test@fgr tmp]$ bzip2 -9 -k services
[test@fgr tmp]$ ls -l services*
-rw-r--r--. 1 test test 670293 4月  19 18:44 services
-rw-r--r--. 1 test test 123932 4月  19 18:44 services.bz2
-rw-rw-r--. 1 test test 135489 4月  19 18:56 services.gz

xz,xzcat/xzmore/xzless/xzgrep

虽然bzip2已经具有很高的压缩比,但是xz的压缩比要更高,用法也和前两者几乎一模一样。

xz的常用参数为:

  • -c:将压缩的数据输出到屏幕上,可透过数据流重导向来处理
  • -d:解压缩的参数
  • -k:保留原文件,而不会删除原始文件
  • -t:测试压缩文件的完整性,看有没有错误
  • -l:累出压缩文件的相关信息
  • -#:#是数字的意思,代表压缩等级,-1最快,但是压缩比最差,-9最慢,但是压缩比最好,预设是-6

以下是xz的使用示例:

#1.压缩/tmp/services
[test@fgr tmp]$ xz -v services
services (1/1)
  100 %        97.3 KiB / 654.6 KiB = 0.149                                    
[test@fgr tmp]$ ls -l services*
-rw-r--r--. 1 test test 123932 4月  19 18:44 services.bz2
-rw-rw-r--. 1 test test 135489 4月  19 18:56 services.gz
-rw-r--r--. 1 test test  99608 4月  19 18:44 services.xz
#2.列出这个压缩文件的信息,然后读取这个压缩文件的内容
[test@fgr tmp]$ xz -l services.xz 
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1     97.3 KiB    654.6 KiB  0.149  CRC64   services.xz
#3.读取压缩文件的内容
[test@fgr tmp]$ xzgrep -n ' 1/tcp' services.xz
23:tcpmux          1/tcp                           # TCP port service multiplexer
#4.解压缩这个文件
[test@fgr tmp]$ xz -d services.xz 
[test@fgr tmp]$ ls -l services*
-rw-r--r--. 1 test test 670293 4月  19 18:44 services
-rw-r--r--. 1 test test 123932 4月  19 18:44 services.bz2
-rw-rw-r--. 1 test test 135489 4月  19 18:56 services.gz
#5.压缩文件并保留原文件
[test@fgr tmp]$ xz -k services
[test@fgr tmp]$ ls -l services*
-rw-r--r--. 1 test test 670293 4月  19 18:44 services
-rw-r--r--. 1 test test 123932 4月  19 18:44 services.bz2
-rw-rw-r--. 1 test test 135489 4月  19 18:56 services.gz
-rw-r--r--. 1 test test  99608 4月  19 18:44 services.xz

最后如果你想要以最快速度压缩文件建议使用gzip,如果你要求的是最高的压缩比那么xz是很好的选择。

你可能感兴趣的:(Linux)