一、前言

压缩文件的用途与技术

  • 概念:比较大型的文件通过压缩技术可以是其磁盘使用率降低,从而达到降低文件容量的效果。此外,有的压缩程序还可以进行容量限制,使一个大型文件可以划分成为数个小型文件,以方便携带
  • 用与好处途:
    • 压缩过的文件容量变小,可以降增加磁盘容量的使用率
    • 在一些网络数据的传输中,数据量降低可以让网络带宽用来做更多的工作。目前很多www网站也是利用文件压缩的技术来进行数据的传送,从而增加网站带宽的利用率

  • 压缩技术

    • 第一种:计算机最小的单位为Bibit,1B=8bit。例如我们存储1字节的数据,会使用8bit来存储,如果这个数据没有、占满8个bit,前面的比特位就会用0填充。我们计算机工程师就利用一些复杂的计算方式,将前面这些没有使用比特空间“丢”出去,以让文件占用的空间变小,这就是压缩技术的其中一种
    • 另一种:将文件中重复的数据进行统计记录。例如:如果你的数据为[111....]共有100个1时,压缩技术就会记录为100个1,而不是真的有100个1的比特位存在,这样也能够精简文件记录的容量

Linux系统常见的压缩、解压、打包命令

  • 命令分类
    • 在Linux环境中,压缩文件的扩展名大多是:*.tar、*.tar.gz、*.tgz、*.gz、*.Z、*.bz2、*.xz等等
    • 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的压缩
  • 不同命令的特点、区别
    • zip:为了支持Windows的压缩文件,Linux也有zip命令
    • compress:这个是个非常老的命令,现在几乎已经不再使用,如果你的系统中还有*.Z的文件,那么可以使用znew将其转变为gzip格式的压缩文件
    • gzip:是由GUN计划开发出来替换compress命令的
    • bzip2、xz:由GUN计划推展处的更好的压缩命令
    • tar:tar命令可以将多个文件打包成一个文件(包括目录),即将很多文件结合成为一个文件。但是单纯的tar命令仅是打包而已,并不提供压缩功能。后来,GUN计划中将tar与压缩功能结合在一起,于是就有了更强大的压缩与打包功能
  • 重点:compress、gzip、bzip2、xz等这些命令只能针对一个文件来压缩和解压。如果想要对多个文件就行压缩和解压,就需要使用到tar命令
  • 一般情况下,重点:小文件的压缩用gzip,大文件的压缩用bzip2。详情见下图的压缩比

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_bzip2

二、gzip命令
  • 功能与特点:
    • gzip可以解压compress、zip、gzip(.gz)等软件所压缩的文件。gzip对后缀为.gz的压缩文件进行操作
    • .gz的压缩文件在Windows下可以被WinRAR或7zip等软件解压
    • 压缩文件时:不加任何参数,不保留源文件。使用-k保留源文件
    • 解压文件时:使用-d参数解压不保留源压缩文件。使用-kd保留压缩文件
  • 格式:gzip  [选项]  文件名

命令选项

  • 压缩时:
    • -k:压缩时单独使用保留源文件
    • -#:#代表数字,代表压缩等级(压缩比)。-1最快,但是压缩比最差,-9最慢,但是压缩比最好。默认为-6
    • -c:将压缩的数据输出到屏幕上,可通过数据流重定向来处理。下面案例中会与>符号配合使用,注意查看
  • 解压时:
    • -d:解压文件,不保存源压缩文件
    • -k:解压时与-d配合使用(必须配合)保留源压缩文件
  • 压缩解压都可用:
    • -v:显示原文件/压缩文件的压缩比等信息
    • -k
  • 单独使用:
    • -t:用来检验一下压缩文件的一致性,看看文件有无错误
    • -l :列出压缩文件的相关信息(压缩前后的对比等)

压缩案例

  • 例如我的目录下有一个services文件
  • 压缩文件,显示压缩比,保留源文件:gzip -kv services

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_02

  • 压缩文件,使用9级压缩,保留源文件:gzip -9k services

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_03

  • 压缩文件,保留源文件,自己设定压缩文件名称:gzip -c services > services.gz
    • -c可以将原本要转成压缩文件的数据内容,将它变成文字类型从屏幕输出,然后我们可以通过大于(>)这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够建立出压缩文件了。后面的压缩文件名是自己规定的,可以自行设定,但必须符合压缩文件名的要求

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_04

  • 压缩文件,不保留源文件:gzip services

解压案例

  • 解压文件,保留源压缩文件,显示压缩比:gzip -dkv services.gz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_05

  • 解压文件,不保留源压缩文件:gzip -d services.gz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_Linux入门基础_06

其它案例

  • 查看压缩文件的压缩比等信息:gzip -l services.gz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_07

  • 检验一下压缩文件的一致性:gzip -t services.gz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_bzip2_08

zcat、zmore、zless、zgrep命令

  • 提示:命令支持compress、gzip所压缩的文件(*.gz)使用(compress所压缩的文件可以被gzip解压缩,所以也支持)
  • zcat、zmore、zless:

    • 概念:普通cat、more、less命令可以读取纯文本文件的内容,zcat、zmore、zless则可以读取纯文本文件被压缩后的压缩文件内容
    • 注意:不再支持cat、more、less命令中的相关选项参数
    • 例如:我们有一个test文件被压缩成一个test2.gz压缩文件。下面读取test.gz的内容:zcat test.gz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_09

  • zgrep

    • 概念:普通grep可以在文本中查找字符串,zgrep则是在压缩文件中查找字符串,不需要解压就可以操作,十分的方便
    • 注意:扔支持grep命令中的相关选项参数
    • 例如:将上面的test.gz压缩文件中查找字符串并并显示出在第几行:zgrep -n 'hello' test.gz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_10

三、bzip2命令
  • 功能与特点:
    • bzip2是为了替换gzip并提供更佳的压缩比,bzip2对后缀为.bz2的压缩文件进行操作
    • bzip2的用法与gzip几乎相同
    • 解压:用到参数-d或-k
    • 压缩:不写任何选项,源文件不会保留。用参数-k压缩时,源文件会保留
  • 格式:bzip2  [选项]  文件名

命令选项

  • 不支持-l选项
  • 压缩时使用:
    • -k:压缩时单独使用保留源文件
    • -#:#代表数字,代表压缩等级(压缩比)。-1最快,但是压缩比最差,-9最慢,但是压缩比最好。默认为-6
    • -c:将压缩的数据输出到屏幕上,可通过数据流重定向来处理。在上面gzip有介绍
  • 解压时使用:
    • -d:将压缩文件进行解压,不保存源压缩文件
    • -k:解压时与-d配合使用(必须配合)保留源压缩文件
  • 压缩解压都可用:

    • -v:显示原文件/压缩文件的压缩比等信息

压缩案例

  • 压缩文件,显示压缩比,保留源文件:bzip2 -kv services

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_11

  • 压缩文件,使用9级压缩,保留源文件:bzip2 -9k services

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_12

  • 压缩文件,保留源文件,自己设定压缩文件名称:bzip2  -c services > services.bz2

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_bzip2_13

  • 压缩文件,不保留源文件:bzip2 services

解压案例

  • 解压文件,保留源压缩文件,显示压缩比:bzip2 -dkv services.bz2

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_14

  • 解压文件,不保留源压缩文件:bzip2 -d services.bz2

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_Linux入门基础_15

bzcat、bzmore、bzless、bzgrep命令

  • 原理和用法与zcat、zmore、zless、zgrep命令相同
  • 这些命令只针对于bzip2所压缩的文件(*.bz2)所使用
四、xz命令
  • 功能与特点:
    • 虽然bzip2已经是很好用的软件了,但是为了满足软件开发者的需要,又推出了xz这个压缩比更高的软件(但是时间花费更久)。xz对后缀为.xz的压缩文件进行操作
    • xz的用法与bzip2几乎相同
    • 解压:用到参数-d或-k
    • 压缩:不写任何选项,源文件不会保留。用参数-k压缩时,源文件会保留
  • 格式:xz  [选项]  文件名

命令选项

  • 压缩时使用:
    • -k:压缩时单独使用保留源文件
    • -#:#代表数字,代表压缩等级(压缩比)。-1最快,但是压缩比最差,-9最慢,但是压缩比最好。默认为-6
    • -c:将压缩的数据输出到屏幕上,可通过数据流重定向来处理。在上面gzip有介绍
  • 解压时使用:
    • -d:将压缩文件进行解压,不保存源压缩文件
    • -k:解压时与-d配合使用(必须配合)保留源压缩文件
  • 压缩解压都可用:
    • -v:显示原文件/压缩文件的压缩比等信息
  • 单独使用:
    • -t:测试压缩文件的完整性,看看有没有错误
    • -l :列出压缩文件的相关信息(压缩前后的对比等)

压缩案例

  • 压缩文件,显示压缩比,保留源文件:xz -kv services

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_Linux入门基础_16

  • 压缩文件,使用9级压缩,保留源文件:xz -9k services

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_17

  • 压缩文件,保留源文件,自己设定压缩文件名称:xz -c services > services.xz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_Linux入门基础_18

  • 压缩文件,不保留源文件:xz services

解压案例

  • 解压文件,保留源压缩文件,显示压缩比:xz -dkv services.xz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_19

  • 解压文件,不保留源压缩文件:xz -d services.xz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_20

其它案例

  • 查看压缩文件的压缩比等信息:xz -l services.xz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_21

  • 检验一下压缩文件的一致性:xz -t services.xz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_22

xzcat、xzmore、zxless、xzgrep命令

  • 原理和用法与zcat、zmore、zless、zgrep命令相同
  • 这些命令只针对于xz所压缩的文件(.xz)所使用
五、tar
  • 功能与特点:
    • tar可以将多个文件/目录打包成为一个大文件的功能
    • tar默认仅提供打包功能,不提供压缩功能
    • tar可以和gzip、bzip2、xz结合,将打包后的大文件进行压缩
    • 目前Windows的WinRAR支持.tar.gz文件名的解压缩
  • 格式
    • 打包与压缩:tar [-z/-j/-J]  [-cv]  [-f  打包/压缩之后的文件名(自己手写)]  要被打包/压缩的文件名
    • 解压缩:tar [-z/-j/-J]  [-xv]  [-f  现在的tar文件名]  [-C 目录]  [指定要解压的文件]
    • 查看文件名:tar [-z/-j/-J]  [-tv]   [-f  现有的tar文件名]

命令选项

  • -c:建立打包文件,可以搭配-v查看打包过程中的文件名
  • -x:解包/解压的功能,可以搭配-C在特定目录下解压
  • -t:查看打包文件的内容包含哪些文件名
  • -v:在压缩/解压的过程中,将正在处理的文件名显示出来
  • -f:表示文件,后面接要被处理的文件名。建议-f单独拿出来写
  • -C:解压时,解压到指定目录下,后面跟目录名
  • -p:打包/压缩时,保留数据的原本属性与权限,常用于备份(-c)重要的配置文件
  • -P:打包/压缩时,保留绝对路径,文件数据名保留根目录/
  • -z:使用gzip方式处理,与"c"结合表示压缩,与"x"结合表示解压。处理的文件名后缀为*.tar.gz
  • -j:使用bzip2方式处理,与"c"结合表示压缩,与"x"结合表示解压。处理的文件名后缀为*.tar.bz2
  • -J:使用xz方式处理,与"c"结合表示压缩,与"x"结合表示解压。处理的文件名后缀为*.tar.xz
  • --exclude=文件名:在压缩/打包的过程中,不要将指定文件打包
  • --newer="日期":只压缩/打包比后面日期还要新的文件/目录。后面的时期包含mtime和ctime
  • --newer-mtime="日期":只压缩/打包比后面日期还要新的文件/目录。后面的日期仅是mtime
  • 注意:
    • 以不同的方式处理,文件的后缀名不同
    • c、x、t不可以出现在同一串命令中。z、j、J不可以出现在同一串命令中

基本术语:tarfile、tarball

  • tarfile:如果我们对文件只是进行简单的打包,并没有压缩,那么打包后的文件就称为tarfile(例如:tar -cv -f file.tar file)
  • tarball:如果我们对文件进行打包,又进行压缩。那么打包压缩后的文件就称为tarball(例如:tar -jcv -f file.tar.bz2 file)

压缩文件并查看压缩文件的内容

  • 下面我们将/etc这个重要目录备份到/root/目录下,因为/etc十分重要,所以使用root权限,否则会出现很多错误
  • 第一步:压缩文件
    • 备注:使用gzip方式压缩,所以使用-z。为了保存文件的原始属性与权限,所以使用-p
tar -zpcv -f /root/etc.tar.gz /etc

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_23

  • 注意:压缩之后,信息第一行会出现一个移除/目录的提示,这个原因会在下面的-P选项时讲到

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_24

  • 第二步:查看tar文件的数据内容
    • 备注:-v会将文件的属性/权限等详细信息显示出来。如果只是想单纯的查看文件名,只需要-t就行
tar -ztv -f /root/etc.tar.gz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_Linux入门基础_25

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_Linux入门基础_26

压缩/打包时-P参数的有无的重要性

  • ①不使用-P参数压缩:从上面压缩事例我们可以看出,我们查看tar文件的数据内容时,文件的路径名前面根目录'/'被去除了。这是为什么哪?
    • 我们在压缩时,如果不加参数-P,压缩后的文件名前面会去除掉根目录/,所以会移除根目录的提示
    • 为什么要这么设计?主要是为了安全。如果这个压缩文件被解压后,假设在/tmp目录下解压,所以解压后,文件名就变为/tmp/etc/xxx。但是如果没有去掉根目录的话,解压后,就会被解压到原来的目录下,即/etc/xxx,那么这样解压之后就会覆盖原来目录下的内容,后果不堪设想
  • ②使用-P参数压缩:保留绝对路径,亦即允许备份数据中含有根目录存在之意
  • 例如将根目录的也备份下来,并查看文件的内容数据
tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_27

tar -jtf /root/etc.and.root.tar.bz2

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_28

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_29

  • 可以看出,使用-P后,文件名包含了根目录。但是不建议使用此参数

打包/压缩时指定不打包某些目录,--exclude选项的使用

  • 何时使用:假设我们打包一个目录,但是不想要其中的某些文件,就可以使用到--exclude这个选项

演示案例:

  • 第一步:此时我们的工作路径为/root,这个路径下有一个目录demo,我们想把/root这个目录打包,但是不想要所有以demo开头的文件/目录,命令格式可以如下书写
    • 注意:--exclude=rootTar.tar.bz2是因为,我们自己生成的压缩文件在/root目录下,但是不想将我们自己生成的这个压缩文件也包含进去,所以使用这一句
tar -jcv -f rootTar.tar.bz2 --exclude=demo* --exclude=rootTar.tar.bz2 /root

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_bzip2_30

  • 第二步:打包完之后,查看一下压缩包里面的内容,发现,demo这个目录并没有打包进来
tar -jtv -f rootTar.tar.bz

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_31

打包/压缩比某个时刻还要新的文件,--newer,--newer-mtime选项的使用

  • --newer="日期":后面的时期包含mtime和ctime
  • --newer-mtime="日期":后面的日期仅是mtime
  • 何时使用:我们只想打包/压缩一些比某些事件还要新的文件,一些旧文件不需要,此时就需要这个参数。比如我们每个月都需要对某一个目录的内容进行备份,这样有了这个选项,就可以选择指定的日期来进行备份,从而不用全部文件都要再备份一次

演示案例:

  • 我们想把/etc下面比/etc/passwd文件还要新的文件进行打包压缩,放入到/root目录下
  • 第一步:查看/etc目录下哪些文件比/etc/passwd文件还要新
find /etc -newer /etc/passwd

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_bzip2_32

  • 第二步:查看/etc/passwd的日期时间为多少
ll /etc/passwd

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_33

  • 第三步:上图可看出,日期为2019/02/10。所以把比这个日期还要新的文件打包压缩
tar -jcv -f /root/newerPasswd.tar.bz2 --newer-mtime="2019/02/10" /etc/*

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_34

  • 第四步:压缩完之后,可以看到最后显示没有被备份的,即not dumped的意思。此时用grep这个命令调出.tar.bz2压缩文件中结尾非/的文件名,就是我们想要的
tar -jtv -f /root/newerPasswd.tar.bz2 | grep -v '/$'

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_35

解压文件:普通解压、配合-C选项使用

  • 不使用-C选项解压:普通解压缩
tar -jxv -f /root/etc.tar.bz2

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_36

  • 解压后生成一个etc/目录

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_bzip2_37

  • 使用-C选项解压:将压缩文件解压到/tmp目录下
tar -jxv -f /root/etc.tar.bz2 -C /tmp

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_38

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_39

解压文件:仅提取出压缩文件中的指定文件

例如:我们压缩后的/etc目录中有一个shadow文件,我们只想从压缩文件中解压出这个文件,其他的不解压

  • 解压:tar  -jxv  -f  /root/etc.tar.bz2  待解开的文件
tar -jxv -f /root/etc.tar.bz2 etc/shadow

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_40

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_41

特殊文件备份:磁带的备份

  • 概念:tar除了可以将数据打包成为文件之间,还能够将文件打包到某些特殊的设备中,比如说磁带(tape)。由于磁盘是一次性读取/写入的设备,因此我们不能够使用类似于cp等命令来复制
  • 例如:我们将/home、/root、/etc备份到磁带(/dev/st0)中,命令格式如下
tar -cv -f /dev/st0 /home /root /etc

特殊应用:利用管道命令与数据流

  • 概念:在tar中,有一种特殊的方法,就是通过标准输入输出的数据流重定向(standard input/standard output),以及管道命令(pipe),将待处理的文件一边打包一边解压到目标目录
  • 案例:
    • 此时我们的工作目录为/tmp,我们将/etc整个目录一边打包一边在/tmp中解开
    • 工作目录必须为/tmp。第一个-:代表输出文件,|:代表管道命令。第二个-:输入文件
    • 其实这个操作与:cp -r /etc /tmp相同
tar -cvf - /etc | tar -xvf - 

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_42

压缩解压后的SELinux问题

  • 概念:如果有时,我们需要将备份的数据恢复到原本的系统中来使用,那么恢复之后,要注意系统的SELinux问题,尤其是系统文件(/etc等)。SELinux的权限问题可能让你的系统无法读写某些配置文件内容,导致影响到系统的正常使用
  • 案例:
    • 我们某次使用tar命令备份了/etc的数据,然后尝试在另一台系统上面恢复。恢复没问题,问题在于恢复完毕之后,无法正常的登录系统,明明是在单人维护的模式下去操作系统,可就是无法登陆。
    • 原因:大部分原因可能就是/etc/shadow这个密码文件的SELinux类型在还原时被更改了,所以导致登录程序无法顺利的读取它
  • 处理方法有以下几种:
    • ①通过各种可行的恢复方式登录系统,然后修改/etc/selinux/config文件,将SELinux改成permissive模式,重新启动系统就正常了
    • ②在第一次恢复系统后,不要立即重新启动,先使用restorecon -Rv /etc自动恢复一下SELinux的类型即可
    • ③通过各种可行的方式登录系统,建立/.autorelabel文件,重新启动后系统会自动修复SELinux的类型,并且又会再次重新启动之后就正常了
    • 推荐使用第②中方法。如果系统已经重新启动了,那么就使用第③中方式解决

系统重要文件的备份案例

  • 概念:我们的系统中有许多的重要目录需要备份使用
    • /etc/(配置文件)
    • /home/(用户的家目录)
    • /var/spool/mail/(系统中所有账号的邮箱)
    • /var/spool/cron/(所有账号的定时任务配置文件)
    • /root(系统管理员的家目录)
    • 另外:/home/loop*不需要备份。并且/root下面的压缩文件也不需要备份
  • 案例:
    • 我们在根目录下建立一个/backups目录,将上面那些重要目录与不需要的目录打包压缩后备份到/backups目录中
    • 备份文件名的格式最好带上日期,例如:back-system-日期
tar -jcv -f /backups/backuo-system-20190213.tar.bz2 --exclude=/root/*.bz2 
--exclude=/root/*.gz --exclude=/home/loop* /etc /home /var/spool/mail /var/spool/cron /root

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_gzip_43

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_tar_44


  • 我是小董,V公众点击"笔记白嫖"解锁更多【Linux入门基础】资料内容。

Linux文件的压缩、解压、打包(gzip、bzip2、xz、tar)_xz_45