常见的压缩解压命令

我们在使用图形界面为主的操作系统时,如果遇到要传输一个文件,例如发送一个邮件的附件,利用即时通讯软件进行文件传输的时候,这些应用通常都是有文件大小的限制的,这种时候,我们通常的会对文件或者整个目录进行压缩的操作,在图形界面下操作起立很简单,都是点击右键,然后在选择需要压缩或者解压的菜单进行对应的操作,而且压缩和解压缩的软件都是已经系统就内置或者购买电脑是就已经预安装了的。其实在Linux的命令行界面,也可以完成这一系列的压缩或者解压缩的操作。

常见的压缩命令

在说命令之前,先说说在Linux系统中,常用的压缩文件扩展名有那些,具体如下表所示:

后缀名 压缩所使用的命令程序
*.zip zip 程序压缩的文件
*.gz gzip 程序压缩的文件
*.bz2 bzip2 程序压缩的文件
*.xz xz 程序压缩的文件
*.tar tar 程序打包的文件,仅仅打包而已,并没有指定压缩程序进行压缩
*.tar.gz tar 程序打包并指定程序使用 gzip 进行压缩的文件
*.tar.b2 tar 程序打包并指定程序使用 bzip 进行压缩的文件
*.tar.xz tar 程序打包并指定程序使用 xz 进行压缩的文件

上表中提及的内容,其实就是常用的gzip、bzip2、xz以及他们配合tar打包的结合版本,而zip指令则是为了支持windows下常见的zip的,最初gzip、bzip2、xz等压缩直接仅支持一个文件来压缩或解压,于是就出现了思维的“打包软件” tar。

tar 可以将多个文件或者目录打包成为一个文件,但是它不提供压缩和解压的能力,最开始的时候 tar 只是一个打包用的命令,这样打包多个文件或者目录确实比较方便,但是打包后还需要使用压缩命令对文件再进行压缩,操作稍微繁琐。后来,GNU计划 将 tar 和压缩的功能结合在一起,以此提升了用户体验和是压缩打包的操作更加的便利。

gzip, zcat/zmore/zless/zgrep

gzip可以说是应用度最广的压缩命令,同时,gzip命令也可以解压zip和gzip甚至是现在比较少用的compress所压缩的文件。当使用gzip进行压缩时,原来的文件会被压缩成一个原文件名加上.gz后缀的文件,同时原始文件会被删除。这点和使用window下的压缩工具的情况很大的不同,也是很多初学者很容易出事踩坑的地方,另外gzip压缩的文件也可以用在window下被winrar、7zip这类软件直接解压。

gzip压缩的文件如果是文本内容的文件可以不用解压直接使用zcat/zmore/zless/zgrep命令查看里面的文本内容,也因为这个原因,例如nginx等应用,都是使用gzip来归档压缩他们的日志文件。gzip的压缩提供了 1~9 一共九个压缩等级,默认是6。在日常的使用中,6这个等级已经非常够用了。

gzip的帮助信息如下图:

gzip帮助信息

简单说一下常用的几个参数: - -c 将压缩的数据输出到屏幕上,可以通过重定向来处理数据流 - -d 解压缩的参数 - -t 可以用来检验一个压缩文件的完整性,也就是查看文件是否有错误 - -v 显示原文件/压缩文件的压缩比例等信息 - -# #代表数字的意思,也就是压缩等级,1速度最快,压缩比最差、9时间最慢,但是压缩比最高。默认是6

那一个生产环境的nginx的access.log文件来验收一下gzip的简单用法

ll -h access.log*
gzip -v access.log 
ll -h access.log*
gzip -d access.log.gz 
ll -h access.log*
gzip -9v access.log
ll -h access.log*

gzip压缩过程

可以看到,压缩后的文件比原来的文件要小很多,而-9压缩的文件比不加压缩等级,也就是默认的-6的文件也比较小。 因为文件里面的文本内容太多,输出后会导致刷屏,不好截图,就不使用zcat或者zmore、zless查看全部内容,仅演示一下zgrep在不解压的使用直接搜索文件里面的内容。

gzip搜索内容

bzip2, bzcat/bzmore/bzless/bzgrep

bzip2是蹦着替代gzip而来的,它提供了比gzip更佳的压缩比和与gzip相同的用法,选项和参数都跟gzip一模一样,就是后缀名由.gz变成.bz2而已。

ll -h access.log*
bzip2 -v access.log 
ll -h access.log*
bzip2 -d access.log.bz2 
ll -h access.log*
bzip2 -9v access.log
ll -h access.log*

bzip2压缩过程

从上面的截图可以看到,使用bzip2压缩后的文件比用gzip压缩的文件压缩比要大很多。

bzgrep搜索内容

xz, xzcat/xzmore/xzless/xzgrep

xz的用法和bzip2、gzip一样,就是压缩比例比前面介绍的两个更高。直接看例子吧

ll -h access.log*
xz -v access.log 
ll -h access.log*
xz -d access.log.xz 
ll -h access.log*
xz -9v access.log
ll -h access.log*

xz压缩过程

因为演示所使用的文件还是比较小,展示不出xz和bzip2的区别

xzgrep搜索内容

zip,unzip

zip压缩格式是一种跨多平台的通用格式,在windows、linux、mac以及移动操作系统都支持使用。相对于gzip等上面提及的压缩格式,linux系统下的zip命令不仅可以压缩文件,还可以压缩目录,并且在压缩完成后并不会删除源文件,而zip文件的解压缩功能则是由unzip命令来完成。

Linux系统中的zip格式文件的压缩和解压缩分别有zip和unzip命令分别完成。他们的常用参数如下表:

zip帮助信息

zip帮助信息

常用参数

参数选项 参数解释说明
-r 将指定目录下的所有文件和子目录一并压缩
-x 压缩文件时排除某个文件
-q 不显示压缩信息

unzip帮助信息

unzip帮助信息

常用参数

参数选项 参数解释说明
-l 不解压显示压缩包内容
-d 指定解压目录
-o 解压时不提示是否覆盖文件
-v 解压是显示详细信息

zip的文件解压和压缩的操作和gzip等类似,下面演示zip和unzip的目录压缩和解压。

压缩文件或者目录的格式为

zip 参数 压缩后的文件名 源文件或者目录

zip加上-r参数可以打包整个目录及其里面的内容。

zip压缩目录

unzip加上-d参数可以指定解压文件到指定位置。格式为

unzip -d 压缩后的文件名 源文件或者目录

unzip解压目录

tar打包

上面提到的命令,处理zip也可以打包压缩目录之外,gzip、bzip2、xz都是只能压缩一个文件,如果要压缩数个甚至是数十个文件,就会生成对应数量的文件,管理起来并不是很方便,因此便诞生了tar命令来解决这个问题。tar可以将多个文件打包在一起变成一个文件。也可以将打包的文件实现打包的解包操作。是Linux系统的管理员最常用的命令之一。很多开源软件如nginx、tomcat、mysql等都有提供使用tar命令打包的源码压缩包供用户下载后编译安装使用。

tar命令在使用上,有点特殊,就是tar后面的参数使用上,有没有 - 是等价的,也就是说,比如要解压一个打包用gzip压缩的文件既可以使用 tar -zc 输入 tar zc 也能实现同样的操作。

tar的帮助信息内容比上面的任何命令都要长,如下图:

tar帮助信息

下面是一些经常会使用到的一些参数和说明

参数 参数的解释和说明
z 通过gzip压缩或解压
c 创建新的tar包
v 显示详细的tar命令执行过程
f 指定压缩文件的名字
t 不解压查看tar包的内容
p 保持文件的原有属性
P(大写) 以绝对路径打包,这个参数有一定的危险性
j 通过bzip2命令压缩或解压
x 解开tar包
C(大写) 指定集结呀的目录路径
--exclude=PATTERN 打包时怕爱出不需要处理的文件或目录
-X 文件名 指定文件读取不需要处理的文件或目录列表
-N 日期 仅打包比指定日期新的文件,可用于增量打包备份
-h 打包软链接文件指向的真实源文件
--hard-dereference 打包硬链接文件

下面用一个简单的例子来演示tar命令的一些常用的用法。 假设我现在有一个目录名为2021,里面有若干个文件,使用tar指定bzip2进行压缩打包,命令如下:

tar -cjvf 2021.tar.bz2 2021/*

c为创建tar文件,j为指定bzip2压缩格式,v为查看打包的过程,f为指定压缩文件的名字。因为tar可以打包多个文件,所格式和其他压缩有所不同,是先指定压缩后的文件名,再指定需要压缩的文件名,多个文件名用空格分隔,如上面的例子中,使用了通配符*,表示指定了目录2021里面的全部文件。压缩后的文件名最好在tar后面加上一个压缩格式的后缀,以便在解压的时候可以知道需要指定什么压缩格式来解压,就像上面例子里面的tar.bz2,就能清楚的知道该文件是bzip2格式的压缩。在解压的时候就知道需要指定j参数。

运行的结果: tar指定bzip2压缩

如果想找打包里面的文件又不想解压文件,可以使用参数t,比如要查看刚才打包的文件。就可以不用解压查看打包文件里面包含了什么文件。

tar -tjvf 2021.tar.bz2

运行的结果: tar不解压查看包含的文件

现在,有新的需求了,需要把这个压缩的文件解压到/tmp目录下的一个叫做picture的目录,需要怎么做呢?其实也不困难,在指定解压之后,再指定一个大写C并指定路径就可以了。

tar xjvf 2021.tar.bz2 -C /tmp/picture/

运行的结果: tar解压目录