一、压缩介绍

如今这个时代电子信息发展迅猛,数据量越来越庞大,魅族10手机摄像头技术都达到1亿象素;2021年9月,三星甚至提出2亿象素的传感技术。为此,压缩数据成为数据储存和传输中用于减少成本和时间的关键技术。

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

2亿象素的ISOCELLHP1,5000万象素的ISOCELLGN5

压缩技术又分为有损压缩与无损压缩两类,二者的主要区别是:有损压缩还原时跟原始信息不是完全一样,而且不影响使用,例如音频、图片、视频类信息;无损压缩还原时跟原始信息完全一样,例如本文要介绍的常用压缩软件RAR,Zip等压缩方式。

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

Windows下比较熟知的压缩方式有zip或则RAR,为了易于压缩与解压的使用,开发了许多的解压缩软件,例如:winrar、好压、快压、360压缩等。并且在Linux比较常用的压缩方式却是gzip、bzip2、compress等,例如官方下载的gcc编译器源码压缩文件就是基于gzip压缩的:gcc-11.2.0.tar.gz。

打包或则压缩格式好多,目前主流使用的有如下表所示几种:

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

表一

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

表二

对于表二类似“xxx.tar.gz”等格式的文件,是Linux下的一种文件格式,生成该格式文件分为两个步骤,(1)、xxx文件打包为xxx.tar;(2)、xxx.tar压缩为xxx.tar.gz。下边大约介绍Linux下tar打包与gz、bz2等压缩工具的使用。

二、Linux打包tar

因为Linux中的好多压缩程序只能针对一个文件进行压缩,因而假如包含许多文件,则须要将所有文件打包为一个文件,之后再压缩。

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

linux压缩文件命令tgz_linux压缩文件命令tgz_linux压缩文件命令tgz

Linux下最常用的打包程序就是tar,使用tar程序打下来的包我们常称为tar包arm linux,tar包文件的扩充名一般是.tar。生成tar包后,就可以用其它的程序(gzip或bzip2等)来进行压缩了。

2.1、tar文件结构

Tar指令只用于多文件打包,并不压缩文件,因而打包后的文件并没有减少,反倒因为在打包时会在每位文件头加入512字节的tar背部信息,致使打包后的文件略微变大。例如当前有文件a1.c、a2.c、a3.c,每位文件100k,打包后文件的文件结构如右图所示:

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

如上图所示,3个文件共300k,通过tar打包后,起码为301.5k;由于tar文件是按块储存,每位块为512bytes大小,所以tar文件大小应当为512字节的倍数,假如a1.c文件大小为99.7k,则通过tar打包时,最后0.3k必须填充为0,补齐至100k(满足512字节的倍数)。

2.2、tar_header颈部结构

tar_header为512字节的块结构,保存旁边的文件信息,tar源码的tar.h文件中该header结构如右图所示,该header结构正好是一个块大小,即512字节每位块。

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

tar源码版本为“tar-1.26.tar.gz”,可通过以下云盘链接下载:

提取码:ppw2

tar打包函数入口为create_archive(),在源码文件create.c中。

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

2.3、tar命令打包

tar命令用于打包操作时,该命令的基本格式为:tar[选项]源文件或目录。tar命令常用的选项及各自的含意如右图所示。

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

(1)、创建2个文件a1.txt、a2.txt,分别输入如下内容:

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

(2)、tar命令进行打包,生成aTar.tar打包文件

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

2.4、aTar.tar文件内容剖析

通过UltraEdit打开里面tar命令打包生成的aTar.tar文件linux论坛,可以看见aTar.tar文件格式为:首先是a1.txt的tar_header信息,之后是a1.txt的内容;接着是a2.txt的tar_header信息,之后是a2txt的内容。

(1)、第一块:从地址0x00000000h位置到0x00000200h之间(共512字节)是a1.txt的tar_header信息:

按照如上结构structposix_header结构体的定义,说明几个数组涵义:

a>、最开始的位置储存name,大小为100字节,内容为61312E74787400,即为“a1.txt”;

b>、后面是mode数组内容为3030303036343400,即为“0000644”,表示a1.txt文件的操作权限,与ls命令查询a1.txt文件权限一致。

c>、uid、gid信息,即当前linux登陆用户id与组id,这两个id的内容均为3030303137353000,即为“0001750”,该值为八补码,转为十补码为1000,与id命令查询的结果一致。

d>、size数组值为303030303030303030333300,即为“”,该值为八补码,转为十补码为27,表示a1.txt文件大小为27字节,与文件内容大小一致:

e>、magic数组值为757374617220,即为“ustar”,表示当前包为tar文件;

f>、uname与gname为当前linux登陆用户名与组名,即kevin。

(2)、第二块:从地址0x00000200h位置到0x00000400h之间(共512字节)是a1.txt的内容,即使a1.txt的内容为27字节,并且块大小为512,不足地方补0。

(3)、第三块:从地址0x00000400h位置到0x00000600h之间(共512字节)是a2.txt的tar_header信息:

a2.txt的tar_header信息格式与a1.txt的tar_header一致,其size数组为“”,转为十补码为21,表示a2.txt内容为21个字符,确认一致。

(4)、第四块:从地址0x00000600h位置到0x00000800h之间(共512字节)是a2.txt的内容,即使a2.txt的内容为21字节,并且块大小为512,不足地方补0。

注:以上与“2.1、tar文件的结构一致”!!!

三、Linux压缩至gz、bz2、z格式

Linux下文件压缩属于无损压缩,解压缩还原时必须和原文件一致,否则会造成程序运行错误;其基本原理为,通过查找文件内的重复字节linux压缩文件命令tgz,构建一个相同字节的辞典文件,并用一个代码表示。例如如下文件:

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

重复的字符串“小团扇的笔记”可以用一个代码“a”表示,则文件内容可以表示为:

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

这文件的大小就缩小了,还原回去也是无信息损失的。

其实压缩算法远比这个复杂,Linux下的压缩工具常用的有GNU组织开发的gzip(.gz)、压缩能力更强的bzip2(.bz2)、比较古老的压缩指令compress(.Z)、以及最新的提供最佳压缩率的XZ(.xz)。

这种压缩命令只能拿来压缩文件,不能压缩目录linux压缩文件命令tgz,虽然指定了目录,也只能压缩目录内的所有文件;同时只能压缩单个文件,因而一般与tar打包命令一起使用,在tar打包命令中加入如下选项即可调用对应的压缩命令进行压缩:

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

3.1、gzip压缩

在tar指令中加入‘-z’选项,调用gzip进行压缩。

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

解压缩命令为:tar–xzfa.tar.gz。

3.2、bzip2压缩

在tar指令中加入‘-j’选项,调用bzip2进行压缩。

解压缩命令为:tar–xjfa.tar.bz2。

3.3、xz压缩

linux压缩文件命令tgz_linux压缩文件命令tgz_linux压缩文件命令tgz

在tar指令中加入‘-J’选项,调用xz进行压缩。

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

解压缩命令为:tar–xJfa.tar.xz。

3.4、compress压缩

现今新的Linux系统都没有安装ncompress压缩工具,须要先安装:

linux下压缩命令gzip和打包命令tar详解(linux用gzip压缩tar文件)

之后在tar指令中加入‘-Z’选项,调用compress进行压缩。

解压缩命令为:tar–xZfa.tar.Z。

3.5、其他压缩工具

Windows下常用的压缩格式zip与rar在Linux下也是支持的。

(1)、Linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序;

(2)、linux下处理.rar文件,须要安装RARforLinux,如下指令:

#tar-xzpvfrarlinux-3.2.0.tar.gz

#cdrar

#make

安装后有rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。

Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复