• 8.2 Linux 系统常见的压缩指令
    • 8.2.1 gzip, zcat/zmore/zless/zgrep
    • 8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep
    • 8.2.3 xz, xzcat/xzmore/xzless/xzgrep

    8.2 Linux 系统常见的压缩指令

    在Linux的环境中,压缩文件的扩展名大多是:“.tar, .tar.gz, .tgz, .gz, .Z, .bz2, *.xz”,为什么会有这样的扩展名呢?不是说 Linux 的扩展名没有什么作用吗?

    这是因为 Linux 支持的压缩指令非常多,且不同的指令所用的压缩技术并不相同,当然彼此之间可能就无法互通压缩/解压缩文件啰。 所以,当你下载到某个压缩文件时,自然就需要知道该文件是由哪种压缩指令所制作出来的,好用来对照着解压缩啊! 也就是说,虽然 Linux 文件的属性基本上是与文件名没有绝对关系的, 但是为了帮助我们人类小小的脑袋瓜子,所以适当的扩展名还是必要的! 下面我们就列出几个常见的压缩文件扩展名吧:

    1. *.Z compress 程序压缩的文件;
    2. *.zip zip 程序压缩的文件;
    3. *.gz gzip 程序压缩的文件;
    4. *.bz2 bzip2 程序压缩的文件;
    5. *.xz xz 程序压缩的文件;
    6. *.tar tar 程序打包的数据,并没有压缩过;
    7. *.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
    8. *.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
    9. *.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩

    Linux上常见的压缩指令就是 gzip, bzip2 以及最新的 xz ,至于 compress 已经退流行了。为了支持 windows 常见的 zip,其实 Linux 也早就有 zip 指令了! gzip 是由 GNU 计划所开发出来的压缩指令,该指令已经取代了 compress 。 后来 GNU 又开发出 bzip2 及 xz 这几个压缩比更好的压缩指令!不过,这些指令通常仅能针对一个文件来压缩与解压缩,如此一来, 每次压缩与解压缩都要一大堆文件,岂不烦人?此时,那个所谓的“打包软件, tar”就显的很重要啦!

    这个 tar 可以将很多文件“打包”成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是“打包”而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能! 下面我们就来谈一谈这些在 Linux 下面基本的压缩指令吧!

    8.2.1 gzip, zcat/zmore/zless/zgrep

    gzip 可以说是应用度最广的压缩指令了!目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件。 至于 gzip 所创建的压缩文件为 *.gz 的文件名喔!让我们来看看这个指令的语法吧:

    1. [dmtsai@study ~]$ gzip [-cdtv#] 文件名
    2. [dmtsai@study ~]$ zcat 文件名.gz
    3. 选项与参数:
    4. -c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
    5. -d :解压缩的参数;
    6. -t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
    7. -v :可以显示出原文件/压缩文件的压缩比等信息;
    8. -# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
    9. 范例一:找出 /etc 下面 (不含子目录) 容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩
    10. [dmtsai@study ~]$ ls -ldSr /etc/* # 忘记选项意义?请自行 man 啰!
    11. .....(前面省略).....
    12. -rw-r--r--. 1 root root 25213 Jun 10 2014 /etc/dnsmasq.conf
    13. -rw-r--r--. 1 root root 69768 May 4 17:55 /etc/ld.so.cache
    14. -rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
    15. [dmtsai@study ~]$ cd /tmp
    16. [dmtsai@study tmp]$ cp /etc/services .
    17. [dmtsai@study tmp]$ gzip -v services
    18. services: 79.7% -- replaced with services.gz
    19. [dmtsai@study tmp]$ ll /etc/services /tmp/services*
    20. -rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
    21. -rw-r--r--. 1 dmtsai dmtsai 136088 Jun 30 18:40 /tmp/services.gz

    当你使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的文件名,原始文件就不再存在了。 这点与一般习惯使用 windows 做压缩的朋友所熟悉的情况不同喔!要注意!要注意! 此外,使用 gzip 压缩的文件在 Windows 系统中,竟然可以被 WinRAR/7zip 这个软件解压缩呢!很好用吧!至于其他的用法如下:

    1. 范例二:由于 services 是文本文件,请将范例一的压缩文件的内容读出来!
    2. [dmtsai@study tmp]$ zcat services.gz
    3. # 由于 services 这个原本的文件是是文本文件,因此我们可以尝试使用 zcat/zmore/zless 去读取!
    4. # 此时屏幕上会显示 servcies.gz 解压缩之后的原始文件内容!
    5. 范例三:将范例一的文件解压缩
    6. [dmtsai@study tmp]$ gzip -d services.gz
    7. # 鸟哥不要使用 gunzip 这个指令,不好背!使用 gzip -d 来进行解压缩!
    8. # 与 gzip 相反, gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件。
    9. 范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
    10. [dmtsai@study tmp]$ gzip -9 -c services > services.gz
    11. 范例五:由范例四再次创建的 services.gz 中,找出 http 这个关键字在哪几行?
    12. [dmtsai@study tmp]$ zgrep -n 'http' services.gz
    13. 14:# http://www.iana.org/assignments/port-numbers
    14. 89:http 80/tcp www www-http # WorldWideWeb HTTP
    15. 90:http 80/udp www www-http # HyperText Transfer Protocol
    16. .....(下面省略).....

    其实 gzip 的压缩已经最优化过了,所以虽然 gzip 提供 1~9 的压缩等级,不过使用默认的 6 就非常好用了! 因此上述的范例四可以不要加入那个 -9 的选项。范例四的重点在那个 -c 与 > 的使用啰!-c 可以将原本要转成压缩文件的数据内容,将它变成文字类型从屏幕输出, 然后我们可以通过大于 (>) 这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够创建出压缩挡了。只是文件名也要自己写, 当然最好还是遵循 gzip 的压缩文件名要求较佳喔!!更多的 > 这个符号的应用,我们会在 bash 章节再次提及!

    cat/more/less 可以使用不同的方式来读取纯文本文件,那个 zcat/zmore/zless 则可以对应于 cat/more/less 的方式来读取纯文本文件被压缩后的压缩文件! 由于 gzip 这个压缩指令主要想要用来取代 compress 的,所以不但 compress 的压缩文件可以使用 gzip 来解开,同时 zcat 这个指令可以同时读取 compress 与 gzip 的压缩文件呦!

    另外,如果你还想要从文字压缩文件当中找数据的话,可以通过 egrep 来搜寻关键字喔!而不需要将压缩文件解开才以 grep 进行! 这对查询备份中的文本文件数据相当有用!

    鸟哥的图示

    Tips 时至今日,应该也没有人爱用 compress 这个老老的指令了!因此,这一章已经拿掉了 compress 的介绍~而如果你还有备份数据使用的是 compress 创建出来的 .Z 文件,那也无须担心,使用 znew 可以将该文件转成 gzip 的格示喔!

    8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep

    若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。 bzip2 真是很不错用的东西~这玩意的压缩比竟然比 gzip 还要好~至于 bzip2 的用法几乎与 gzip 相同!看看下面的用法吧!

    1. [dmtsai@study ~]$ bzip2 [-cdkzv#] 文件名
    2. [dmtsai@study ~]$ bzcat 文件名.bz2
    3. 选项与参数:
    4. -c :将压缩的过程产生的数据输出到屏幕上!
    5. -d :解压缩的参数
    6. -k :保留原始文件,而不会删除原始的文件喔!
    7. -z :压缩的参数 (默认值,可以不加)
    8. -v :可以显示出原文件/压缩文件的压缩比等信息;
    9. -# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
    10. 范例一:将刚刚 gzip 范例留下来的 /tmp/services bzip2 压缩
    11. [dmtsai@study tmp]$ bzip2 -v services
    12. services: 5.409:1, 1.479 bits/Byte, 81.51% saved, 670293 in, 123932 out.
    13. [dmtsai@study tmp]$ ls -l services*
    14. -rw-r--r--. 1 dmtsai dmtsai 123932 Jun 30 18:40 services.bz2
    15. -rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
    16. # 此时 services 会变成 services.bz2 之外,你也可以发现 bzip2 的压缩比要较 gzip 好喔!!
    17. # 压缩率由 gzip 的 79% 提升到 bzip2 的 81% 哩!
    18. 范例二:将范例一的文件内容读出来!
    19. [dmtsai@study tmp]$ bzcat services.bz2
    20. 范例三:将范例一的文件解压缩
    21. [dmtsai@study tmp]$ bzip2 -d services.bz2
    22. 范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
    23. [dmtsai@study tmp]$ bzip2 -9 -c services > services.bz2

    看上面的范例,你会发现到 bzip2 连选项与参数都跟 gzip 一模一样!只是扩展名由 .gz 变成 .bz2 而已!其他的用法都大同小异,所以鸟哥就不一一介绍了! 你也可以发现到 bzip2 的压缩率确实比 gzip 要好些!不过,对于大容量文件来说,bzip2 压缩时间会花比较久喔!至少比 gzip 要久的多! 这没办法~要有更多可用容量,就得要花费相对应的时间!还 OK 啊!

    8.2.3 xz, xzcat/xzmore/xzless/xzgrep

    虽然 bzip2 已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了 xz 这个压缩比更高的软件!这个软件的用法也跟 gzip/bzip2 几乎一模一样! 那我们就来瞧一瞧!

    1. [dmtsai@study ~]$ xz [-dtlkc#] 文件名
    2. [dmtsai@study ~]$ xcat 文件名.xz
    3. 选项与参数:
    4. -d :就是解压缩啊!
    5. -t :测试压缩文件的完整性,看有没有错误
    6. -l :列出压缩文件的相关信息
    7. -k :保留原本的文件不删除~
    8. -c :同样的,就是将数据由屏幕上输出的意思!
    9. -# :同样的,也有较佳的压缩比的意思!
    10. 范例一:将刚刚由 bzip2 所遗留下来的 /tmp/services 通过 xz 来压缩!
    11. [dmtsai@study tmp]$ xz -v services
    12. services 1/1
    13. 100 % 97.3 KiB / 654.6 KiB = 0.149
    14. [dmtsai@study tmp]$ ls -l services*
    15. -rw-rw-r--. 1 dmtsai dmtsai 123932 Jun 30 19:09 services.bz2
    16. -rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
    17. -rw-r--r--. 1 dmtsai dmtsai 99608 Jun 30 18:40 services.xz
    18. # 各位观众!看到没有啊!!容量又进一步下降的更多耶!好棒的压缩比!
    19. 范例二:列出这个压缩文件的信息,然后读出这个压缩文件的内容
    20. [dmtsai@study tmp]$ xz -l services.xz
    21. Strms Blocks Compressed Uncompressed Ratio Check Filename
    22. 1 1 97.3 KiB 654.6 KiB 0.149 CRC64 services.xz
    23. # 竟然可以列出这个文件的压缩前后的容量,真是太人性化了!这样观察就方便多了!
    24. [dmtsai@study tmp]$ xzcat services.xz
    25. 范例三:将他解压缩吧!
    26. [dmtsai@study tmp]$ xz -d services.xz
    27. 范例四:保留原文件的文件名,并且创建压缩文件!
    28. [dmtsai@study tmp]$ xz -k services

    虽然 xz 这个压缩比真的好太多太多了!以鸟哥选择的这个 services 文件为范例,他可以将 gzip 压缩比 (压缩后/压缩前) 的 21% 更进一步优化到 15% 耶! 差非常非常多!不过, xz 最大的问题是…时间花太久了!如果你曾经使用过 xz 的话,应该会有发现,他的运算时间真的比 gzip 久很多喔!

    鸟哥以自己的系统,通过“ time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz] ”去执行运算结果,结果发现这三个指令的执行时间依序是: 0.019s, 0.042s, 0.261s, 看最后一个数字!差了 10 倍的时间耶!所以,如果你并不觉得时间是你的成本考虑,那么使用 xz 会比较好!如果时间是你的重要成本,那么 gzip 恐怕是比较适合的压缩软件喔!

    原文: https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/70.html