你好,我是goldsunC
让我们一起进步吧!
前言
我们知道,在面向对象的程序设计中,一切皆对象
。而在Linux操作系统中,一切皆文件
,因此我们总会跟文件打交道。
Linux文件系统很庞大复杂,不过有很多时候,在我们需要将文件分享给其他人的时候,经常会用到文件压缩,因为如果文件太大的话在分享给其他人时就需要传输更多的数据。下载一个几十M的压缩包和下载几百M的源文件,估计大家都会选择前者吧。或者有时候我们需要对文件进行备份,源文件数据量太大会占用更多磁盘空间,也需要压缩。例如以上的情况,我们经常会用到文件压缩和解压这一操作。
用惯了Windows的我们可能觉得这是一个很简单的事情,有很多软件能轻松实现文件压缩和解压,比如鄙人最喜欢的Bandzip
,非常轻量级的一个小压缩软件,使用它只需要简单的点几下就能轻松实现文件压缩和解压的操作,简直不要太方便。但是用Linux的话,如果我们用shell来操作,可就没法简单点几下就完成任务了。我们需要掌握一些简单的压缩知识以及命令操作。
什么是文件压缩
目前我们使用的计算机系统中都是使用所谓的字节单位(byte)
来计量。而事实上,bit
才是计算机最小的计量单位,而1Byte=8bit
,如果我们只需要记忆一个数字1
,那系统会如何记录?是的,它会这么记录:
00000001
因为一个字节等于八个比特,每个比特值为0或1,如果记录一个数字1,它会在最右边占据1个位,而其它的7个位则会被自动地填上0。其实那7个位应该是空的才对。不过,计算机为了要满足我们的操作系统数据的读写,所以就会将该数据转为字节的形式来记录。
而一些聪明的计算机工程师就是利用一些复杂的计算方式,将这些没有用到的空间丢出来,以让文件占用的空间变小,这就是压缩的技术。
还有一种压缩技术,它是将重复的数据进行统计记录。例如,如果某个数据为[111111······]
共有100个1时,那么压缩技术会记录为[100个1]
而不是真的有100个1的位存在。这样也能给精简文件记录的容量。
压缩技术简单来讲,就是将文件中的一些没有用到的空间填满,让空间利用率更高而已。但是既然你压缩了文件,那么我们的操作系统当然无法之间读取他们,因此,如果想要使用这些被压缩过的文件,就必须将它还原为未压缩前的状态,这也就是解压缩
。
压缩文件最大的好处就是让文件的容量变小,以至于你可以在相同的空间存放更多的文件,或者在网络传输时传输的更快。
Linux常见压缩指令
在Linux环境中,压缩文件的扩展名大多是:.tar
、.tar.gz
、.tgz
、.gz
、.Z
、.bz2
、.xz
。
如果你有一些Linux基础,我们知道在Linux中文件的扩展名并没有什么实际的作用,那为什么会有这样的扩展名呢?
这是因为Linux支持的压缩命令非常多,且不同的命令所使用的压缩技术并不相同,因此彼此之间就可能无法互通压缩/解压缩
文件。所以使用扩展名以让你知道该文件是使用了哪种压缩命令压缩的,好用来对照着解压缩。虽然Linux文件的属性和文件名没有绝对关系,但是清晰的文件名可以用来帮我们人类这小脑袋来辨别。
*.Z compress程序压缩的文件;
*.zip zip程序压缩的文件;
*.gz gzip程序压缩的文件;
*.bz2 bzip2程序压缩的文件;
*.xz xz程序压缩的文件;
*.tar tar程序打包的文件,没有被压缩;
*.tar.gz tar程序打包的文件,经过gzip的压缩;
*.tar.bz2 tar程序打包的文件,经过bzip2的压缩;
*.tar.xz tar程序打包的文件,经过xz的压缩;
Linux上常见的压缩命令是gzip
、bzip2
和xz
,而compress
实际上已经被gzip
替换了。其中zip
命令其实早就有了,主要是为了支持Windows常见的zip压缩包。
gzip
是由GNU计划所开发出来的压缩命令,bzip2
及xz
是GNU后来开发出的压缩比更好的压缩命令。不过不管哪个命令,通常仅能针对一个文件来压缩和解压缩,如此以来,每次压缩与解压缩都要一大堆文件岂不烦人,这个时候,打包,tar
就显得非常重要。
tar
可以将很多个文件打包成为一个文件,就算是目录也不在话下,不过单纯的tar
并没有压缩功能,仅仅能够打包而已,后来在GNU计划中,将整个tar
与压缩的功能结合在了一起,如此就能更方便的进行压缩与打包了。
gizp
gzip
几乎是应用最广的压缩命令了,它所建立的压缩文件扩展名为.gz
。该命令基本语法如下:
gzip [-cdtv#] filename
其各选项参数简介如下:
-c
:将解压缩的数据输出到屏幕上,可通过数据流重定向来处理;-d
:解压缩的参数;-t
:可以用来检验一个压缩文件的一致性,看看文件是否有错误;-v
:可以显示出原文件和压缩文件的压缩比等信息;-#
:#为数字的意思,代表压缩等级,其取值在[1-9],其中1最快,压缩比最差,9最慢,压缩比最好,默认情况下是6;
如下图所示,在我的Templates
目录下有一个文件services
,如果我想要将其压缩,我可以这么做:
![24fc02ac6e921062036c53e6eddbf95a.png](https://i-blog.csdnimg.cn/blog_migrate/b639c0d3b645f6a9d733b46f08aaacf1.png)
从图中可以看到,gzip -v services
即可将该文件压缩,同时压缩之后压缩文件的扩展名加上了.gz
,而加上了-v
参数使得打印出了文件的压缩比等信息,可以看到文件被压缩了将近80%,这个效果已经很不错了。
需要注意的是,当使用gzip
进行压缩时,压缩之后源文件就不再存在了。此外,使用gzip
压缩的文件在Windows系统中可以被WinRAR
、7zip
、Bandzip
等这些软件解压缩,很好用。
而当我们把文件压缩之后,一般情况下会把文件先解压缩再访问,而实际上,我们可以使用zcat
、zmore
、zless
、zgrep
等命令来之间读取压缩文件。是不是很熟悉?只是在我们的常用命令前加了z
而已。
如图所示使用zmore
读取一页services.gz
文件:
![f6d79d5168308e39a1b2c749be9956ab.png](https://i-blog.csdnimg.cn/blog_migrate/67195d29e08501c3062c45c956d982b8.png)
另外,实际上我们可以在压缩文件的时候不删除源文件,如例:
gzip -c services > services.gz
这样的话压缩文件之后源文件还在,同时生成了压缩文件。其重点在于-c
和>
的使用,-c
可以将原本要转成压缩文件的数据内容变成文字类型在屏幕上输出,然后我们可以通过>
这个符号,将原本应该从屏幕输出的数据,转成输出到文件还不是屏幕,所以就能够建立出一个新的压缩文件。
bzip2和xz
学会了gzip
,其实bzip2
和xz
差不多也就会了,这两个用法和gzip
差不多,主要是为了提供更好的压缩比而诞生的。
bzip2
命令基本语法如下:
bzip2 [-cdkzv#] filename
其各选项参数简介如下:
-c
:将压缩过程产生的数据输出到屏幕上;-d
:解压缩的参数;-k
:保留原始文件,而不删除原始文件;-z
:压缩的参数(默认值,可不加);-v
:可以显示出原文件和压缩文件的压缩比等信息;-#
:与gzip
同样,为压缩比参数;
xz
命令基本语法如下:
xz [-dtlkc#] filename
-d
:解压缩;-t
:可以用来检验一个压缩文件的一致性,看看文件是否有错误;-l
:列出压缩文件的相关信息;-k
:保留原始文件,而不删除原始文件;-c
:将压缩过程产生的数据输出到屏幕上;
总的来说,gzip->bzip2->xz
是一个压缩比越来越好,但是执行时间越来越长的变化。如果你在意时间成本,可以使用gzip
,如果想压缩的更好,使用xz
,至于bzip2
,则比较折中。
打包指令
tar
前面谈到的压缩指令大多都只能对单一文件进行压缩,虽然gzip
、bzip2
、xz
也能够对目录进行压缩,不过它们对目录的压缩是指将目录内的所有文件分别进行压缩
的操作。而不像在Windows系统,可以通过软件直接将许多数据包成一个文件的样式。
在Linux下,则有专门的打包指令:tar
。
这个指令不仅仅可以对文件进行打包,同时可以通过压缩指令的支持,将文件同时进行压缩。
tar
命令基本语法如下:
打包与压缩:
tar [-z|-j-J] [cv] [-f 待建立的新文件名] filename
查看文件名:
tar [-z|-j-J] [tv] [-f 既有的tar文件名]
解压缩:
tar [-z|-j|-J] [xv] [-f 既有的tar文件名] [-C 目录]
各选项参数简介如下:
-c
:建立打包文件,可搭配-v
来查看过程中被打包的文件名;-t
:查看打包文件的内容含有哪些文件名,重点是查看文件名;-x
:解包或解压缩功能,可搭配-C
在特点目录解压,默认在当前目录;-z
:通过gzip
支持进行压缩和解压缩,文件名最好是*.tar.gz
;-j
:通过bzip2
的支持进行压缩和解压缩,文件名最好是*.tar.bz2
;-J
:通过xz
的支持进行压缩和解压缩,文件名最好是*.tar.xz
;-v
:在压缩或解压缩过程中,将正在处理的文件名显示出来;-f
:参数后加要被处理的文件名;-C 目录
:指定目录解压;-p
:保留备份数据的原本权限与属性,常用于备份重要的配置文件。-P
:保留绝对路径,即运行备份数据中包含根目录。--exclude=FILE
:在压缩过程中,不要打包FILE。
tar
命令的参数比较多,也说明了其能实现的操作比较多。
其中的-c,-t,-x
三个参数不能同时出现,因为它们分别代表打包压缩、查看文件名、解压缩之意。
其中的-z,-j,-J
三个参数也不能同时出现,因为它们分别代表用哪一种压缩命令进行支持。
打包指令使用方法也比较简单,只需要明白各个参数的意义使用时加以选择即可,不过比较重要的是字体加粗的三个参数。
其中-p
指保留数据的原本权限与属性,这个比较好理解,Linux本就是一个权限非常严格的系统,毕竟是一个多人多任务的系统,权限的管理非常重要,不明白的同学可自行学习。保留原本权限与属性可以使得打包后的文件与原来的文件更加一模一样
。
-P
指数据中包含/
根目录,也就是说默认情况下是不包含根目录的。为什么要去掉根目录?主要是为了安全。因为我们使用tar
备份的数据有可能会解压缩回来使用,如果去掉了根目录,解压缩后的文件就会在当前文件夹产生,而如果包含了根目录,解压缩后的文件会可能会覆盖原本文件下的数据。
举个例子,你打包了/etc/
下的所有文件进行备份,如果去掉了根目录/
,那么如果你解压时在的是Templates
文件夹,那么文件目录就变成了Templates/etc/
,而如果没有去掉根目录,他就会覆盖你原本来的/etc
。也就是备份数据就会把当前系统文件覆盖。这时候你可能会想,既然是备份,不就是为了恢复那个状态吗,直接覆盖了不是更好?不过万一你那个备份的数据版本比较旧呢?你只是打开查看一下一些内容而已,结果备份数据直接把你当前数据覆盖了,你如何是好?
--exclude==FILE
的意思是在打包的时候不包含指定的文件,例如一个文件下有四个文件,你想打包其中的三个,你只需要在打包的时候使用此参数指定那个文件即可。
• end •
走在路上
goldsunC
![5c72cb4bf964277051697cbf103e2aca.png](https://i-blog.csdnimg.cn/blog_migrate/77008457914a806d8cc6e16d1b5cf90b.jpeg)