第七节.Linux文件与文件系统的压缩

最后更新于 2021-10-08 486 次阅读


1.压缩的本质

压缩的本质其实就是用不同的算法去想办法把一个文件没有用到的空间给压榨出来,使其降低空间的占用。

2.Linux常用的压缩命令

(1)Lliux中常用的压缩后缀

虽然文件后缀名在Linux系统中并没用实际的的作用,但是利用不同的后缀名可以便于我们去区分一个压缩文件到底是由什么算法压缩而成的。

①*.zip

zip程序压缩的文件

②*.gz

gzip程序压缩的文件

③*.bz2

bzip2程序压缩的文件

④*.xz

xz程序压缩的文件

⑤*.tar

tar程序打包的文件,没有经过压缩

⑥*.tar.gz

tar程序打包,并经过gzip程序压缩

⑦*.tar.bz2

tar程序打包,并经过bzip2程序压缩

⑧*.tar.xz

tar程序打包,并经过xz程序压缩

(2)gzip命令,zcat/zmore/zless/zgrep

gzip压缩命令,默认情况下gzip命令压缩会直接把源文件进行压缩,压缩后源文件变成gz文件了(源文件会消失),解压也一样,压缩文件会消失。

zcat/zmore/zless命令可以用于查看压缩后的纯文本文件(cat直接查看会出现乱码)

zgrep 命令还可以用于直接查找压缩文件里的数据

zcat命令演示

命令格式:gzip 【-c d t v #】 待压缩的文件/待解压的文件

zcat/zmore/zless/zgrep 压缩文件.gz

例如:gzip -v9 /tmp/laoju

常用参数:

-d:gzip默认是压缩,加入-d参数之后就是解压缩

gzip -d 命令演示

-v:显示源文件和压缩文件的压缩比信息

gzip -v 命令演示

-c:将压缩/解压缩的数据输出到屏幕上,相当于windows压缩时你可以看到的压缩文件过程

-t:可以检验压缩文件一致性,看看文件有无错误

-#:#为数字,1-9,1压缩比最低,速度最快;9压缩比最高,速度最慢。

gzip -#命令演示

(3)bzip2命令,bzcat/bzmore/bzless/bzgrep

bzip2命令与gzip命令差不多类似,压缩比好过gzip。

命令格式:bzip2 【-c d k v #】 待压缩的文件/待解压的文件

例如:bzip2 -v9 /tmp/services

常用参数:

-d:同gzip,默认是压缩,加入-d参数后是解压

-k:压缩和解压缩时保留源文件,不会删除(重要)

-c:将压缩/解压的过程输出在屏幕上

-v:输出压缩比

-#:#代表数字1-9,同gz,压缩比参数

bzip2 和 gzip压缩比对比

(4)xz命令,xzcat/xzmore/xzless/xzgrep

同gzip和bzip2一样是压缩命令,但是具有更高的压缩比,速度也更慢。

命令格式:xz 【-d k l t c v #】待压缩/待解压的文件

例如:xz -kv /tmp/service

常用参数:

-d:同gzip、bzip2,解压参数

-k:保留源文件,不删除

-l(L小写):列出压缩文件的相关信息

xz -l 命令演示

-t:压缩文件一致性检查

-c:将压缩/解压的过程输出在屏幕上

-v:输出压缩比

-#:代表数字1-9,同gz,压缩比参数

xz 和 bzip2 和 gzip压缩比对比

(5)tar命令(兼顾打包及压缩)

目前,我们以上所学的gzip,bzip2等命令都是压缩命令,没办法像windows一样用WinRAR那样的软件对多个目录进行打包压缩。所以,在Linux上,我们要需要用到tar这一个命令,tar这个命令既能够对多个目录进行合并打包的同时,还能进行gzip、bzip2等压缩命令。

命令格式:

压缩:tar 【-z | -j | -J】 【-cv】 【-f 待建立的压缩文件名】 【欲压缩的文件】

例如:tar -zcv -f /backups/etc-newer.tar.gz /etc/*

tar -jcv -f /backups/etc-newer.tar.bz2 /etc/*

tar -Jcv -f /backups/etc-newer.tar.xz /etc/*

查看:tar 【-z | -j | -J】 【-tv】【-f 欲查看内容的压缩文件】

例如:tar -jtv -f /backups/etc-newer.tar.bz2

解压:tar 【-z | -j | -J】 【-xv】【-f 欲解压的压缩文件】 【-C 欲解压的位置】

例如:tar -jxv -f /backups/etc-newer.tar.bz2 -C /backups

常用参数:

-c:打包命令,建立打包文件,配合-v可以查看进行打包的文件。

tar -cv命令演示

-t:查看打包文件的内容含有哪些文件名

tar -tv 命令

-x:解包或解压缩命令,一般配合-C 指定特定的需要解包的位置

tar -xv -C命令演示

注意:-c -t -x三个命令不能同时使用

-z:配合-c -t -x命令使用,通过gzip程序进行压缩/解压缩,此时文件的后缀最好为.tar.gz

tar -zc 命令演示

-j:配合-c -t -x命令使用,通过bzip2程序进行压缩/解压缩,此时文件的后缀最好为.tar.bz2

tar -jc 命令演示

-J:配合-c -t -x命令使用,通过xz程序进行压缩/解压缩,此时文件的后缀最好为tar.xz

tar -Jc 命令演示

注意:-z -j -J命令不能同时使用

-f:-f 后面一定要立刻接跟你想要创建的打包的文件的名字,例如-f /backups/etc.tar.bz2。建议-f单独列一个选项。

-C:常用于解包中指定要解压到的目录

-p(小写):保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件

-P(大写):保留数据的绝对路径(根目录),比如备份etc这个文件夹,加入-P参数后,就会直接保留绝对路径(根目录)备份/etc这个文件夹,解压的时候,哪怕你在/tmp这个目录下解压,也会因为解压的文件带有绝对路径,而直接解压覆盖掉/etc下的文件内容。

--exclude=FILE:在打包时,输入这个参数可以自己选择不需要打包的文件,例如:tar -cjv -f /tmp/etc.tar.bz2 --exclude=/etc/*.bz2 /etc/ (打包/etc这个文件夹,但是不打包里边的bz2压缩文件)

(6)tar命令的常用案例

①解压一个文件夹中单独的某一个文件

假如我有一个压缩文件夹叫asoul,其中有ava、carol、diana三个文件夹,我想单独解压ava这个文件夹,我该如何解压?

首先我们可以通过tar -tjv+grep这个命令来查询我们所要解压的文件的具体路径

例如:tar -jtv -f /tmp/laoju/asoul.tar.bz2 | grep 'ava'

(使用管道|加grep命令来截取关键词‘ava’)

tar -tjv命令截取关键词演示

从以上我们得到解压路径/tmp/laoju/asoul/ava,然后我们可以使用tar -xjv这个解压命令来解压我们所需要的文件

例如:tar -xjv -f /tmp/laoju/asoul.tar.bz2 tmp/laoju/asoul/ava -C /tmp/laoju(-C指定你想要解压的位置)

输入完上边的命令,然后查询文件夹里边,你会发现为什么不是ava文件夹,而是一个tmp文件?

然后我们打开这个tmp文件夹发现,ava文件在这个tmp文件夹的最后一层

这是怎么回事呢?原来我们在解压asoul.tar.bz2这个文件的时候,解压出来的文件时默认带着压缩前的路径的

所以,我们要想直接在/tmp/laoju这个目录下直接解压出ava这个文件夹,我们就必须去掉ava这个文件夹前边的路径,这时候我们就需要命令--strip-components=number(放在命令最后),其中number为你想去掉的路径的层数,在这个案例中,我们需要去掉ava前的tmp/laoju/asoul三层路径,所以命令就是--strip-compons=3。

例如:tar -xjv -f /tmp/laoju/asoul.tar.bz2 tmp/laoju/asoul/ava -C /tmp/laoju --strip-components=3

可以看出ava文件夹被直接解压到了/tmp/laoju目录中

②打包某个目录,但是不打包该目录下的一些文件

还是如上的例子,假设我有一个asoul文件夹,其中有ava、carol、diana三个子文件夹,我只想打包ava和carol两个文件夹的东西,不想打包diana,那我应该怎么办?

这次我们需要用到一个命令,就是--exclude=file这个命令,所以完整的命令应该是:

例:tar -cjv -f /tmp/laoju/asoul.tar.bz2 --exclude=/tmp/laoju/asoul/diana /tmp/laoju/asoul

tar --exclude命令演示
③仅备份比某个时刻还要新的文件

假如我想要备份/etc这个文件夹的文件,但是我在7月10日已经备份过一次了,现在7月21号我想在备份一次,可是我又不想重新再完整备份一次,此时我应该怎么办?

此时可以使用--newer或--newer-mtime这两个命令,单纯使用--newer这个命令时,比对的是mtime(内容修改时间)和ctime(权限属性修改时间),而使用--newer-mtime时,单纯只是比对mtime。

范例的命令是:tar -cjv -f /tmp/etc.newer20210721.tar.bz2 \ >

--newer-mtime='2021/07/21' /etc(命令再输入时,如果想分成两行输入,那就在想要分行的地方输入反斜杠“\”回车,就可以自动分成两行)

tar --newer-mtime 命令演示

那如果我想找到比某个文件还要新的文件,又该如何找?

那我们要用到find这个命令,参数的话就用-newer这个参数

例如我想在/etc里找比/etc/passwd这个文件更新的文件,那我的命令就应该是:find /etc -newer /etc/passwd

3.XFS文件系统的备份与还原

tar命令多是用于文件或者目录的备份,那如果想针对整个文件系统来进行备份和还原的话应该怎么办?这时候就要用的两个命令,xfsdump备份,xfsrestore还原。

(1)xfsdump(XFS文件系统的备份)

xfsdump这个命令不仅可以整对文件系统做完整备份(Full backup)还可以进行增量备份(Incremental backups),那么啥是增量备份?

增量备份是针对于完整备份来说的,比如说我在7月10号做了一次文件系统的完整备份,现在7月21号想在做一次备份,此时我就没有必要做完整备份了,我只需要备份与7月10号的文件系统有差异的文件就行了,这就叫增量备份。

命令格式:xfsdump 【-l #(#代表数字0-9,0代表完整备份,1-9属于增量备份)】【-L S_label.name】【-M M_label.name】【-f 备份文件的文件名】 待备份数据

例如:xfsdump -l 0 -L boot_newer -M boot_newer -f /srv/boot.dump /boot

常用参数:

-I(大写的i):查看xfs的备份信息状态(从/var/lib/xfsdump/inventory读取)

xfsdump -I命令演示

-f:跟tar一样,-f 后边接你想要备份的文件的名字和目录

-l (小写L)#:-l参数后面跟数字0-9,表示备份等级,0是完整备份

xfsdump -l 增量数据命令显示

-L:记录每次备份的session标头,可以填写针对这一文件系统的详细说明(在备份信息状态里显示在session lable这一栏)

-M:记录每次备份的media(存储媒介)标头

-M label参数显示

xfsdump命令注意事项:

Ⅰ.xfsdump只支持已挂载文件系统的备份,使用df命令查看挂载的目录(例如在这个系统中/boot)

df -h查看文件系统挂载点

Ⅱ.xfsdump必须使用root权限备份

Ⅲ.xfsdump备份的文件只能使用xfsrestore命令还原

Ⅳ.xfsdump只能备份xfs系统

Ⅴ.xfsdump是通过文件系统的UUID来辨别各个备份文件,无法备份两个UUID一致的文件系统

Ⅵ.xfsdump只支持文件系统的备份,不支持特定目录的备份

(2)xfsrestore(XFS文件系统还原)

xfsdump生成的备份文件可以使用xfsrestore来还原

命令格式:xfsrestore 【-f 备份文件】【-L S.lable_name】【-s r i】 待恢复目录

例如:xfsrestore -f /srv/boot.dump -L xfs_l2 /boot

常用参数:

-f:后续跟备份文件的文件名

-I:跟xfsdump相同的输出,可以查询xfs备份信息

-L:后面跟之前xfsdump中输入的session lable.name信息

-s:接某一特定目录,亦即仅回复某一文件或目录

例如:我想仅恢复备份文件里的ava.img这个文件到/backups/boot1中,则命令为:

xfsrestore -L boot_new -f /srv/boot.dump -s ava.img /tmp/boot2

-r:通过增量备份文件来回复系统(一般按照顺序来回复备份0→1→2....)

例如:xfsrestore -f /srv/boot_1 -L boot_1 /boot

注意:可以用diff -r命令来区分两个文件夹文件的差异,例如:diff -r /boot /tmp/boot

-i:进入交互模式,高级管理员使用