一、什么压缩,什么是打包?
1)压缩
『文件压缩』呢?我们来稍微谈一谈他的原理好了。目前我们使用的电脑系统中都是使用所谓的 bytes 单位来计量的!不过,事实上,电脑最小的计量单位应该是 bits 才对啊。此外,我们也知道 1 byte = 8 bits 。但是如果今天我们只是记忆一个数字,亦即是 1 这个数字呢?他会如何记录?假设一个 byte 可以看成底下的模样:
□□□□□□□□
由于我们记录数字是 1 ,考虑电脑所谓的二进位, 1 会在最右边占据 1 个 bit ,而其他的 7 个 bits 将会自动的被填上 0 ,其实在这样的例子中,那 7 个 bits 应该是『空的』才对!不过,为了要满足目前我们的操作系统数据的访问,所以就会将该数据转为 byte 的型态来记录了!通过利用一些复杂的计算方式, 将这些没有使用到的空间『丢』出来,以让文件占用的空间变小!
另外一种压缩技术也很有趣,他是将重复的数据进行统计记录的。举例来说,如果你的数据为『111…』共有100个1时, 那么压缩技术会记录为『100个1』而不是真的有100个1的比特存在!这样也能够精简文件记录的容量呢!
2) 打包(tar)
这个 tar 可以将很多文件『打包』成为一个文件!目录也可。不过,单纯的 tar 功能仅是『打包』而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供用户更方便并且更强大的压缩与打包功能!
二、压缩与解压缩命名
1)gzip, zcat/zmore/zless/zgrep
$ gzip [-cdtv#] 文件名
注意:使用 gzip 进行压缩时,在缺省的状态下原本的文件会被压缩成为 .gz 的文件名,源文件案就不再存在了
选项与参数:
-c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩档的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!缺省是 -6
$ zcat/zmore/zless 文件名.gz
# 查看压缩文件的内容
注意:解压缩使用的命令为:
$ gzip -d 文件名.gz
$ zgrep -n 'http' services.gz
# 找出 'http'在这个关键字在services.gz哪几行?
2)bzip2, bzcat/bzmore/bzless/bzgrep(压缩比比gzip好)
$ bzip2 [-cdkzv#] 文件名
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留源文件案,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
$ bzcat/bzmore/bzless 文件名.bz2
注意:解压缩使用的命令为:
bzip2 -d services.bz2
可以发现到 bzip2 的压缩率确实比 gzip 要好些!不过,对于大容量文件来说,bzip2 压缩时间会花比较久喔!至少比 gzip 要久的多。
3) xz, xzcat/xzmore/xzless/xzgrep(缩比更高的软件)
$ xz [-dtlkc#] 文件名
选项与参数:
-d :就是解压缩啊!
-t :测试压缩档的完整性,看有没有错误
-l :列出压缩档的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!
$ xcat/xzmore/xzless/ 文件名.xz
注意:解压缩使用的命令为:
$ xz -d services.xz
三、 打包指令: tar
tar 可以将多个目录或文件打包成一个大文件,同时还可以透过 gzip/bzip2/xz 的支持,将该文件同时进行压缩。
$ tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename... <==打包与压缩
$ tar [-z|-j|-J] [tv] [-f 既有的 tar文件名] <==察看文件名
$ tar [-z|-j|-J] [xv] [-f 既有的 tar文件名] [-C 目录] <==解压缩
选项与参数:
-c :创建打包文件,可搭配 -v 来察看过程中被打包的文件名(filename)
-t :察看打包文件的内容含有哪些文件名,重点在察看『文件名』就是了;
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
特别留意的是, -c, -t, -x 不可同时出现在一串指令列中。
-z :透过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz
-j :透过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2
-J :透过 xz 的支持进行压缩/解压缩:此时文件名最好为 *.tar.xz
特别留意, -z, -j, -J 不可以同时出现在一串指令列中
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
-f filename:-f 后面要立刻接要被处理的文件名!建议 -f 单独写一个选项啰!(比较不会忘记)
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
其他后续练习会使用到的选项介绍:
-p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的设置档
-P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!
最简单的tar使用:
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
解压压缩文件中特定文件(grep)
$ tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
打包某目录,但不含该目录下的某些文件之作法(exclude)
假设我们想要打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件, 而且假设这个新的打包文件要放置成为 /root/system.tar.bz2 ,当然这个文件自己不要打包自己 (因为这个文件放置在 /root 底下啊!)
$ tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
--exclude=/root/system.tar.bz2 /etc /root
参考资料:
【1】鸟哥的Linux私房菜——文件与文件系统的压缩,打包与备份