文件压缩

通常压缩技术都是应用在减少文件大小上。比如微信传给好友文件时,文件大小上限100M,此时需要传的文件却是110M,但是经过压缩技术,110M的文件可能压缩成<=100M,好友接收后解压缩文件就可恢复到原本的大小110M。

因为这些比较大型的文件透过所谓的文件压缩技术之后,可以将他的磁碟使用量降低, 可以达到减低文件容量的效果,此外,有的压缩程序还可以进行容量限制, 使一个大型文件可以分割成为数个小型文件,以方便软盘片携带。

文件压缩原理

那么什么是文件压缩原理?目前我们使用的计算机系统中都是使用所谓的 **byte **单位来计量的!不过,事实上,计算机最小的计量单位应该是 **bit **才对啊,此外,我们也知道 1 byte = 8 bit 。但是如果今天我们只是保存一个数字,亦即是 1 这个数字呢?磁盘会如何记录?假设一个 byte 可以看成底下的模样:

由於我们记录数字是 1 ,考虑计算机所谓的二进位喔,如此一来, 1 会在最右边占据 1 个 bit ,而其他的 7 个 bit 将会自动的被填上 0 !你看看,其实在这样的例子中,那 7 个 bits应该是空的才对!不过,为了要满足目前我们的操作系统数据的存取规范,所以就会将该数据转为 byte 的型态来记录了!而一些聪明的计算机工程师就利用一些复杂的计算方式, 将这些没有使用到的空间出来,以让文件占用的空间变小!这就是压缩的技术!

另外一种压缩技术也很有趣,是将重复的数据进行统计记录的。举例来说,如果你的数据为『111....』共有100个1时, 那么压缩技术会记录为『100个1』而不是真的有100个1的位存在!这样也能够精简文件记录的容量!

简单的说,你可以将文件压缩原理想成,其实文件里面有相当多的空间存在,并不是完全填满的, 而压缩的技术就是将这些空间填满,以让整个文件占用的容量下降!不过,这些压缩过的文件并无法直接被我们的操作系统所使用的,因此, 若要使用这些被压缩过的文件数据,则必须将他还原回来未压缩前的模样, 那就是所谓的解压缩!而至于压缩前与压缩后的文件所占用的磁碟空间大小, 就可以被称为是压缩比

扩展:
WWW网站压缩技术蛮有趣的!他让你网站上面『看的到的数据』在经过网络传输时,使用的是『压缩过的数据』, 等到这些压缩过的数据到达你的计算机主机时,再进行解压缩,由於目前的计算机运算速度相当的快速, 因此其实在网页浏览的时候,时间都是花在『数据的传输』上面,而不是 CPU 的运算啦!如此一来,由於压缩过的数据量降低了,自然传送的速度就会增快不少!

Linux常见的压缩命令

命令 压缩比 后缀名 查看压缩后的文件内容命令
compress + .Z -
gzip ++ .gz zcat
bzip2 +++ .bz2 bzcat
强调,compress 已经很少人在使用了,因为这支程序无法解开 *.gz 的文件,而 gzip 则可以解开 *.Z 的文件。
  • *.Z compress 程序压缩的文件;
  • *.gz gzip 程序压缩的文件;
  • *.bz2 bzip2 程序压缩的文件;
  • *.tar tar 程序打包的数据,并没有压缩过;
  • *.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
  • *.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩

Linux上常见的压缩命令就是 gzip 与 bzip2 ,至於 compress 已经退流行了。 gzip 是由 GNU计划 所开发出来的压缩命令,该命令已经取代了 compress 。 后来 GNU计划 又开发出 bzip2 这个压缩比更好的压缩命令!不过,这些命令通常仅能针对一个文件来压缩与解压缩,如此一来, 每次压缩与解压缩都要一大堆文件,岂不烦人?此时,打包软件tar就显的很重要啦!

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

扩展:什么是GNU,FSF,GPL?

  • GNU:Gnu's Not Unix 的缩写, 官网1984年史托曼开始着手GNU计划,这个计划的目的建立一个自由的开放的UNIX.但是写一个UNIX非常困难,所以史托曼打算先写运行在UNIX的小程序.但所有的软件都需要编译器编译源代码,史托曼决定先一个C语言的编译器(GUN C gcc)。但编译器也写得并不顺利,于是,他写了Emacs编辑器.因了Emacs很得非常好,史托曼赚了一点钱,从而开始全力编写其他软件.当史托曼在成立自由软件基金会(Free Software Foundation,FSF)后,他请了请了更多的工程师和志愿者在编写软件,终于完成GCC的编写。
  • FSF:Free Software Foundation的缩写,官网, 创立于1985年,负责GNU Project的运营。
  • GPL: General Public License的缩写。1985年,为了避免GNU所开发的自由软件被其他人修改而成为版权软件,史托曼与律师草拟了有名的通用公共许可证(General Public License , GPL)。

gzip命令

选项与参数:

  • -c :将压缩的数据输出到萤幕上,可透过数据流重导向来处理;将压缩数据输出到标准输出中,并保留源文件。
  • -d :解压缩的参数;
  • -t :可以用来检验一个压缩档的一致性~看看文件有无错误;
  • -v :可以显示出原文件/压缩文件的压缩比等资讯;
  • -r : 递归压缩指定目录下以及子目录下的所有文件。
  • -# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6

bzip2命令

若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。 bzip2 的用法几乎与 gzip 相同!
选项与参数:

  • -c :将压缩的过程产生的数据输出到萤幕上!将压缩数据输出到标准输出中,并保留源文件。
  • -d :解压缩的参数
  • -k :保留原始文件,而不会删除原始的文件喔!
  • -z :压缩的参数
  • -v :可以显示出原文件/压缩文件的压缩比等资讯;
  • -r : 递归压缩指定目录下以及子目录下的所有文件。
  • -# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!

gzip压缩目录实例:
/home/test目录建立a.txt,b.txt,c.txt文件,内容如下:

[root@localhost test]# ls
a.txt  b.txt  c.txt
[root@localhost test]# cat a.txt 
11111111111111111111111111111
11111111111111111111111111111
1111111111111111111111111111
111111111111111111111111111
[root@localhost test]# cat b.txt 
22222222222222222222222222222
222222222222222222222222222
22222222222222222222222222222222222
22222222222222222222222222222
[root@localhost test]# cat c.txt 
3333333333333333333333333333
33333333333333333333333333333
333333333333333333333
[root@localhost test]# 

使用gzip直接压缩test目录,可以看到是将目录内的所有文件 "分别" 进行压缩:

[root@localhost test]# gzip /home/test
gzip: /home/test is a directory -- ignored
[root@localhost test]# gzip -r /home/test
[root@localhost test]# ls
a.txt.gz  b.txt.gz  c.txt.gz
[root@localhost test]# 

打包命令tar

前一小节谈到的命令大多仅能针对单一文件来进行压缩,虽然 gzip 与 bzip2 也能够针对目录来进行压缩, 不过,这两个命令对目录的压缩指的是将目录内的所有文件 "分别" 进行压缩的动作! 而不像在 Windows 的系统,可以使用类似 WinRAR 这一类的压缩软件来将好多数据打包成一个文件的样式。
这种将多个文件或目录包成一个大文件的命令功能,我们可以称呼他是一种打包命令! 那 Linux 这种打包命令就是 tar命令。tar 可以将多个目录或文件打包成一个大文件,同时还可以通过 gzip/bzip2 的支持将该文件进行压缩!
选项与参数:

  • -c :创建打包文件,可搭配 -v 来察看过程中被打包的文件名(filename)
  • -t :查看打包文件的内容含有哪些文件名,重点在查看文件名;
  • -x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
    特别留意的是, -c、-t、-x 不可同时出现在一串命令列中。
  • -j :通过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2
  • -z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz
  • -v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
  • -f filename:-f 后面要立刻接要被处理的文件名!建议 -f 单独写一个选项!
  • -C 目录 : 改变至目录 DIR。这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。这个用在压缩,可以指定绝对路径。
  • -p :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
  • -P :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
  • --exclude=FILE:在压缩的过程中,不要将 FILE 打包!

tar打包不压缩实例

[root@localhost test]# tar -cv -f test.tar /home/test
tar: Removing leading `/' from member names
/home/test/
/home/test/a.txt
/home/test/b.txt
/home/test/c.txt
tar: /home/test/test.tar: file is the archive; not dumped
[root@localhost test]# ls
a.txt  b.txt  c.txt  test.tar
[root@localhost test]# 

注意:输出第一句tar: Removing leading `/' from member names是警告,稍后解释。
可以看到已经将目录所有文件打包成一个文件test.tar,查看test.tar包内容:

[root@localhost test]# ls
a.txt  b.txt  c.txt  test.tar
[root@localhost test]# 
[root@localhost test]# tar -tv -f test.tar 
drwxrwxrwx root/root         0 2021-05-23 02:29 home/test/
-rwxrwxrwx root/root       117 2021-05-23 02:11 home/test/a.txt
-rwxrwxrwx root/root       124 2021-05-23 02:11 home/test/b.txt
-rwxrwxrwx root/root        81 2021-05-23 02:11 home/test/c.txt
[root@localhost test]# 

从上面的数据可以发现一件很有趣的事情,那就是每个文件名都没了根目录 / 了!这也是上面出现的那个警告信息**tar: Removing leading /' from member names**(移除了文件名开头的 /' )所告知的情况!

那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来使用, 在 tar 所记录的文件名(就是刚刚使用 tar -tv -f 所查看到的文件名) 那就是解包后的实际文件名。 如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的文件名就会变成/tmp/home/test/xxx。 但如果没有拿掉根目录,解压缩后的文件名就会是绝对路径, 即解压缩后的数据一定会被放置到 /home/test/xxx 去,如此一来,你的原本的 /home/test/ 底下的数据, 就会被备份数据所覆盖过去了!

扩展:打包时忽略文件的目录结构

[root@localhost test]# ls
a.txt  b.txt  c.txt
[root@localhost test]# tar -cvf test.tar -C /home/test *
a.txt
b.txt
c.txt
[root@localhost test]# ls
a.txt  b.txt  c.txt  test.tar
[root@localhost test]# tar -tvf test.tar 
-rwxrwxrwx root/root       117 2021-05-23 02:11 a.txt
-rwxrwxrwx root/root       124 2021-05-23 02:11 b.txt
-rwxrwxrwx root/root        81 2021-05-23 02:11 c.txt
[root@localhost test]# 
[root@localhost test]# ls
a.txt  b.txt  c.txt
[root@localhost test]# tar -cvf test.tar -C /home/ test/
test/
test/a.txt
test/b.txt
test/c.txt
[root@localhost test]# ls
a.txt  b.txt  c.txt  test.tar
[root@localhost test]# tar -tvf test.tar 
-rwxrwxrwx root/root       117 2021-05-23 02:11 test/a.txt
-rwxrwxrwx root/root       124 2021-05-23 02:11 test/b.txt
-rwxrwxrwx root/root        81 2021-05-23 02:11 test/c.txt
[root@localhost test]# 

tar打包压缩实例

[root@localhost test]# tar -czvf test.tar.gz *
a.txt
b.txt
c.txt
[root@localhost test]# ls
a.txt  b.txt  c.txt  test.tar.gz
[root@localhost test]# tar -tvf test.tar.gz 
-rwxrwxrwx root/root       117 2021-05-23 02:11 a.txt
-rwxrwxrwx root/root       124 2021-05-23 02:11 b.txt
-rwxrwxrwx root/root        81 2021-05-23 02:11 c.txt
[root@localhost test]# 
posted on 2021-05-23 17:09  哑吧  阅读(1153)  评论(0编辑  收藏  举报