一、前言
为了使传输的文件大小尽可能地小,我们采用压缩的方式生成压缩文件,然后将压缩包传输过去就可以了。衡量压缩方法地好坏主要有两点综合考量:一是压缩速度,二是压缩程度。很好理解,压缩一个文件,我当然不能一直等他压缩吧,不然还赶不上直接传输呢。另外,压缩程度不够的话,文件还是那么大,这跟我们的诉求不一样啊,我们就是为了尽可能地小,它压缩一下就压缩了百分之一,这还不如不压缩,毫无意义。
不知道大家学过数据结构中地哈夫曼树吗,哈夫曼编码就是一种压缩算法。我们本节要将地zip和gzip都使用了哈夫曼编码作为其压缩算法中的一部分。bzip2和rar也与哈夫曼编码有一定的关系:
zip:使用DEFLATE算法,而DEFLATE算法是基于LZ77算法和哈夫曼编码的组合
gzip:同样使用DEFLATE算法
bzip2:使用的是Burrows-Wheller变换和移动块排序算法,最后结合哈夫曼编码,但不是直接用哈夫曼编码进行压缩的。
rar:使用了多种压缩算法:主要是LZSS,结合哈夫曼编码、移动块排序等,新版本(如RAR 5.0)还引入了多线程压缩,利用现代多核处理器提高压缩速率和效率。
好了,言归正传,我们本次就来说一说linux下常用的gzip、bzip2以及不太常用的zip、rar。
二、gzip与bzip2
先来看一下该文件下有什么文件:
此时如果我们使用gzip命令对a.txt进行压缩,让我们看一下结果:
问题一:这与我们使用windows的压缩不一样啊,使用windows时,我们压缩后,会生成新的压缩文件夹,并没有覆盖原来的压缩文件。
暂时解压一下文件:
然后使用gzip命令,压缩两个文件:
问题二:尝试压缩多个文件时,同样分别对源文件直接压缩,并没有生成新的压缩文件夹,也没有将两个文件归为一个文件。
所以单纯的gzip和gunzip并不能帮我们解决日常的需求。bzip2命令同样如此。所以需要结合linux下的打包指令tar。
tar:将一些文件打包成一份新的文件夹,通常使用tar做后缀名。语法:
#打包:
tar -cvf 打包后的文件名 待打包资料列表
#解包:
tar -xvf 打包文件
参数解释:
-c:打包 -x:解包
-v:显示打包进度条
-f:必须放在最后紧挨着打包的文件名。
下面给个示例:将a.txt.gz和b.c.gz给打包成一个文件gzfile.tar:
我们可以看到,虽然将两个文件打包了,但是并没有将原来的文件覆盖,而且支持同时操作多个文件合并。
这时候我们将a.txt.gz和b.c.gz删除,来看一下解包后,是否会解包为两个文件:
我们可以看到,解包为了两个文件,并且打包文件并灭有消失。这非常符合我们的预期,但是,通过ls -lh我们看到,打包后的文件远远大于源文件的两个大小,源文件为两个压缩文件,总共才50B,打包后的文件反而成了10K的大小。所以就需要将tar与gzip等指令进行配合使用:
使用gzip对打包文件gzfile.tar进行压缩,然后大小从10K减小到了190B。此时我们就又遇到了两个问题:
问题一:每次压缩文件都写两个命令,太麻烦了,我想一蹴而就,有办法:
以解压命令为例:在选项中加入-z选项,就会自动在执行完打包命令后执行gzip命令,如果配合-c,那就是压缩,如果配合-x那就是解压缩。
对于bzip2命令的使用方法同样如上:只不过选项不是-z,而是-j,来看一下:
问题二:为什么压缩后的文件还是比原文件加起来还要大,这还压缩什么?
这是因为有几个原因会造成这样的情况,并非所有时候都是这样的。
文件类型:某些类型的文件(如已经压缩过的文件,比如 JPEG 图片、MP3 音乐等)在二次压缩时,可能会导致比原文件更大的输出文件。因为压缩算法在这些文件上没有更多的可压缩数据可利用。
压缩级别:
tar
命令的压缩只是在一定程度上进行的,具体压缩程度取决于使用的压缩算法。如果你使用-z
选项,它会调用gzip
,该算法的默认压缩力度并不是最高的。如果需要更高的压缩率,可以考虑使用其他工具(如xz
或bzip2
)并调整压缩参数。元数据和结构开销:压缩包内包含了文件的元数据(如文件权限、时间戳等),这在某些情况下可能显著增加文件大小。
空文件和小文件:如果你压缩的原文件中包含很多空文件或特别小的文件,这些在打包后可能占用的总空间反而比压缩前要大。
观察上面三个原因,我们可能违反了三条:1、文件类型为已经压缩过的文件,3、元数据开销(通常相对大文件而言,可以忽略不计这点大小。除非违反了第四条)4、空文件或小文件(由于文件太小,我还要额外保存文件的相关信息,额外有了空间开销)。
三、zip命令
语法:
zip [选项] zipfile files
【-r】递归压缩文件夹及其内容
【-e】加密压缩文件
【-9】使用最大压缩级别
使用示例:
zip archive.zip file1.txt #压缩单个文件
zip archive.zip file1.txt file2.txt #压缩多个文件
zip -r archive.zip folder_name #压缩整个文件夹
zip -e archive.zip file1.txt #加密压缩文件
zip -9 archive.zip file1.txt #使用最大级别压缩文件
unzip [选项] zipfile
【-d】指定解压目录
【-l】列出压缩包内的文件、不压缩
【-o】覆盖已存在的文件
使用示例:
unzip archive.zip #解压缩指定文件
unzip archive.zip -d /path/to/destination/ #解压缩文件到指定目录
unzip -l archive.zip #查看压缩包内的文件列表
unzip -o archive.zip #解压完如果路径下存在包内文件将覆盖已存在文件
如果系统中没有安装这两个命令,可以使用:
sudo apt update
sudo apt install zip unzip
四、rar命令
首先,安装rar以及unrar两个工具:
sudo apt update
sudo apt install rar unrar
压缩:
rar a <压缩文件名>.rar <要压缩的文件或目录>
rar a my_archive.rar my_folder #例如压缩一个名为my_folder的目录
rar a -v10m my_archive.part rar my_folder #-v 创建10M大的分卷,压缩文件
rar a -m5 my_archive.rar my_folder #-m 设置压缩级别从0-5
rar a -r my_archive.rar my_folder #-r 递归地压缩子目录和文件
解压:
unrar x <压缩文件名>.rar
unrar x my_archive.rar #例如解压一个名为my_archive.rar的压缩文件
unrar x my_archive.rar <目标目录> #解压到指定目录
unrar l my_archive.rar #l 查看压缩文件内容
unrar e my_archive.rar <文件名> #e 仅提取特定文件
感谢大家!