Linux常见压缩指令小结

什么是压缩技术

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...

相关推荐
麦兜*26 分钟前
【Spring Boot】Spring Boot 4.0 的颠覆性AI特性全景解析,结合智能编码实战案例、底层架构革新及Prompt工程手册
java·人工智能·spring boot·后端·spring·架构
江南一点雨27 分钟前
ChatGPT,从规则到强化学习
后端
用户92724725021930 分钟前
实现新闻自动采集并发布到博客
后端
野犬寒鸦35 分钟前
MyBatis-Plus 中使用 Wrapper 自定义 SQL
java·数据库·后端·sql·mybatis
expect7g42 分钟前
Java的DNS缓存问题
java·后端
全栈凯哥1 小时前
20.缓存问题与解决方案详解教程
java·spring boot·redis·后端·缓存
小莫分享1 小时前
2023年最新总结,阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总。
java·后端·面试·职场和发展
Brookty1 小时前
【操作系统】线程
java·linux·服务器·后端·学习·java-ee·操作系统
源码云商1 小时前
基于 SpringBoot + Vue 的 IT 技术交流和分享平台的设计与实现
vue.js·spring boot·后端
程序员爱钓鱼2 小时前
Go语言实战案例-简易计算器(加减乘除)
后端