文件压缩
通常压缩技术都是应用在减少文件大小上。比如微信传给好友文件时,文件大小上限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]#