什么是压缩技术
Linux操作系统中文件是以byte进行表示存储,如果我们的文件的二进制仅仅在低位占一个1,例如:
bash
0000 0001
为了节约空间这种情况我们可以将byte进行压缩,将高位的0全部抹掉,节省磁盘占用空间。除了这种压缩基数,还有一种就是计数法的压缩基数,例如某个文件的二进制位有100个1,压缩时我们直接使用"100个1"这种方式来对文件格式转换压缩。
zip/unzip指令详解
命令选项
js
-x 文件列表:解压文件,但不包含文件列表中指定的文件
-t:测试压缩文件有无损坏,并不解压
-v:查看压缩文件的详细信息,具体包括压缩文件中包含的文件大小、文件名和压缩比等,并不解压
-n:解压时不覆盖已经存在的文件
-o:解压时覆盖已经存在的文件,并且不要求用户确认
-d 目录名:把压缩文件解压到指定目录下
递归压缩
为了方便演示压缩,我们在tmp下创建一个包含3个文件的zipDir
bash
# 创建zipDir
mkdir zipDir
# 进入zipDir
cd zipDir
# 创建3个文件
touch file1 file2 file3
然后直接使用使用最高级别9,将zipDir文件夹下所有文件或者文件夹通通压缩到zipDir.zip中
bash
zip -9r /tmp/zipDir.zip /tmp/zipDir/
排除指定文件压缩
若我们希望压缩zipDir目录时,不压缩file3,我们可以直接在压缩时通过-x指令指定排除的文件:
bash
zip -9r /tmp/zipDirWithoutFile3.zip /tmp/zipDir -x "/tmp/zipDir/file3"
可以看到压缩过程中,并没有包括file3

删除压缩包中的文件
假如压缩时不小心将file3存到压缩包zipDir.zip中,且这个文件夹压缩非常耗时你又不想重新压缩,你可以直接通过-d指令指定删除的文件将目标压缩包中的某个文件删除,命令如下所示,注意-d后面要制定和压缩包中相同的文件名所在操作系统中的路径:
bash
zip /tmp/zipDir.zip -d /tmp/zipDir/file3

补充文件到压缩包
若我们压缩时漏掉了某个压缩文件,我们也可以通过-u指令将指定文件存入压缩包中:
bash
zip -u /tmp/zipDir.zip /tmp/zipDir/file3

这条指令同样支持将文件夹下的指定内容添加到压缩包中,命令如下
bash
# 将file打头的文件添加到压缩包中
zip -u /tmp/zipDir.zip /tmp/zipDir/file*
解压缩
对于压缩包的解压缩选项常见的就是以下三种:
bash
-o:解压时无脑覆盖目标路径文件
-x:解压时若目标文件夹有该文件则不覆盖
-d:指定目标解压位置
如下命令所示,这条命令会将zipDir.zip
解压到/tmp/unzipDir/
文件夹下,并且若当前文件夹下有file3则不覆盖:
bash
unzip -o /tmp/zipDir.zip -x zipDir/file3 -d /tmp/unzipDir/
输出结果如下,符合预期:

gzip/gunzip
常见选项
该命令只能对文件进行压缩,若指定目录也仅仅是对目录下的文件进行压缩,对应的选项如下所示:
bash
-d:对压缩的文件进行解压
-r:递归式压缩指定目录以及子目录下的所有文件
-t:检查压缩文档的完整性
-v:对于每个压缩和解压缩的文档,显示相应的文件名和压缩比
-l:显示压缩文件的压缩信息,显示字段为压缩文档大小、未压缩文档大小、压缩比和未压缩文档名称
-num:用指定的数字num配置压缩比,"-1"或"-fast"表示最低压缩比,"-9"或"-best"表示最高压缩比,系统默认压缩比为6
递归压缩文件
为了方便演示,我们这里也创建了一个gzipDir,并在这个目录下创建3个文件:
bash
mkdir gzipDir;cd gzipDir;touch file1;touch file2;touch file3;
因为gzip无法直接压缩文件夹所以需要先用zip压缩一下文件夹:
bash
zip -r /tmp/gzipDir.zip /tmp/gzipDir/
这里我们使用-9v
,指定gzip
以最高级别压缩比压缩文件,并显示压缩过程:
bash
gzip -9v /tmp/gzipDir.zip
输出结果如下:

显示压缩比
我们希望文件压缩时查看文件的压缩比,就可以通过-l文件指定:
bash
gzip -l /tmp/gzipDir.zip.gz
可以看到我们的文件压缩比还是很高的:

解压缩到当前目录
bash
gzip -d /tmp/gzipDir.zip.gz
bzip2/bunzip2
常见命令选项
bash
-d:执行解压缩,此时选项后面跟要解压缩的文件
-v:压缩或解压文件时,显示详细信息
-k:bzip2在压缩或解压缩后,会删除原始文件,若要保留原始文件,可使用此选项
-f:bzip2在压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件。若要覆盖,就要使用此选项
-t:测试".bz2"压缩文件的完整性
-压缩级别:压缩级别可以从1~9中选取,数字越大,压缩率越高
与gzip差不多,bzip2也是用于压缩文件的,压缩时会删除文件的信息,但是用如下选项即可完成使用最高压缩比,并且压缩时不删除源文件,显示压缩进度的完成压缩:
bash
bzip2 -9vk /tmp/*
可以看到压缩后的源文件也在,查看压缩也可以知晓压缩比率还是很高的:

解压缩同样使用-d即可。
tar命令详解
命令选项
该指令仅仅是对文件或者文件夹做打包而已,对应选项如下:
bash
-c:新建文件
-r:把要归档的文件追加到档案文件的末尾
-t:列出档案文件中已经归档的文件列表
-x:从打包的档案文件中还原出文件
-u:更新档案文件,用新建文件替换档案中的原始文件
tar也有一些辅助选项指令:
bash
-z:调用gip命令在文件打包的过程中压缩/解压文件
-w:在还原文件时,把所有文件的修改时间设定为现在时间
-j:调用bzip2命令在文件打包的过程中压缩/解压文件
-Z:调用compress命令过滤档案
-f:选项后面紧跟档案文件的存储设备,默认是磁盘,需要指定档案文件名;如果是磁带,只
-f需指定磁带设备名即可。注意,在"-f"选项之后不能再跟任何其他选项,也就是说,"-f"必须是tar命令的最后一个选项
-v:指定在创建归档文件过程中,显示各个归档文件的名称
-p:在文件归档的过程中,保持文件的属性不发生变化
-N "yyyy/mm/dd":在指定日期之后的文件才会打包到档案文件中
--exclude file:在打包过程中,不将指定file文件打包
普通压缩
演示前我们还是要创建示例文件夹和文件
bash
mkdir tarDir;cd tarDir;touch file1;touch file2;touch file3;
新建文件并显示压缩过程和归档文件名称
bash
tar -cvf /tmp/tardir.tar /tmp/tarDir/

调用gzip、bzip2压缩
调用gzip压缩,添加一个-z
即可
tar -zcvf tardir.tar.gz tardir.tar
调用bz2压缩
tar -jcvf tardir.tar.bz2 tardir.tar
解压缩
将上文的c改为x即可,例如上文压缩原始压缩文件tardir.tar
,我们压缩命令为
tar -xvf tardir.tar
gz结尾的tar文件,则用zx
tar -vf tardir.tar.gz
bz2结尾的tar文件则用jx
tar -jxvf tardir.tar.bz2
dd
dd常用于文件备份,将指定文件输出到对应文件夹,常见的选项如下:
bash
if:就是输入文件,可以是设备,例如,磁盘某分区或者整个磁盘。
of:就是输出文件,也可以是输出设备,例如,磁盘、磁带等。
bs:指定一个block的大小,如果没有指定,默认为512字节。count:就是"bs"的数量。
备份示例
将/etc/inittab 备份至 /etc/inittab.bak
javascript
dd if=/etc/inittab of=/etc/inittab.bak
我们都知道操作系统存储最基础单位为块。从下图输出可以看到备份过程中,用了0+1的块。说明使用了0个完整的块+1个不到的块完成文件备份。

cpio详解
命令选项
cpio该命令也是用于文件备份和还原的
bash
-o:将文件复制、打包成文件或者将文件输出到设备上
-i:将打包文件解压或者将设备上的备份还原到系统中
-t:查看cpio打包的文件内容或者输出到设备上的文件内容
-v:显示打包过程中的文件名称
-d:在cpio还原文件的过程中,自动建立相应的目录
-c:一种较新的存储方式
-B:让默认块可以增大到5120字节,默认块为512字节,这样做的好处是可以加快存取速度。
备份
找到将tarDir
并将其备份到tmp的backDir.cpio
中并显示压缩过程以及增加存储块的大小:
bash
find /tmp/tarDir/ | cpio -ocvB >/tmp/backDir.cpio
输出结果如下,可以看到当前压缩的文件大小刚刚好一个特殊的块大小:

恢复
为了演示还原,笔者将被压缩的源文件删除,使用cpio的-icduv选项将直接备份的文件原原本本还原为原来路径的原来文件:
javascript
cpio -icduv < /tmp/backDir.cpio

参考文献
鸟哥的Linux私房菜:book.douban.com/subject/488...
循序渐进Linux(第2版):book.douban.com/subject/267...