Linux 基础(11) - 文件与文件系统的压缩,打包与备份

1. 统常见的压缩指令

*.Z compress 程序压缩的文件;
*.zip zip 程序压缩的文件;
*.gz gzip 程序压缩的文件;
*.bz2 bzip2 程序压缩的文件;
*.xz xz 程序压缩的文件;
*.tar tar 程序打包的数据,并没有压缩过;
*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩

1.1 gzip

gzip [-cdtv#] 文档名
选项与参数:
-c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件案的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6

当使用 gzip 进行压缩时,在预设的状态下原本的文件会被压缩成为 .gz 的档名,源文件就不再存在了。
这点与一般习惯使用 windows 做压缩的朋友所熟悉的情况不同喔!要注意!要注意!

zcat 文档名.gz

由于 services 这个原本的文件是是文本文件,因此我们可以尝试使用 zcat/zmore/zless 去读取
此时屏幕上会显示 servcies.gz 解压缩之后的源文件内容!

gzip -d services.gz
与 gzip 相反, gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件。

gzip -9 -c services > services.gz
将解开的 services 用最佳的压缩比压缩,并保留原本的文件

zgrep -n 'http' services.gz
从 services.gz 中,找出 http 这个关键词在哪几行?

1.2 bzip2, bzcat/bzmore/bzless/bzgrep

bzip2 [-cdkzv#] 文档名
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留源文件,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件案的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!

services 会变成 services.bz2, bzip2 的压缩比要较 gzip 好,压缩率由 gzip 的 61% 提升到 bzip2 的 62% !

bzcat 文档名.bz2
读取bz2压缩文件

bzip2 -d services.bz2
解压bz2压缩文件

bzip2 -k -9 services
保留源文件并压缩文件

1.3 xz, xzcat/xzmore/xzless/xzgrep

虽然 bzip2 已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了 xz 这个压缩比更高的软件!
xz [-dtlkc#] 文档名
选项与参数:
-d :就是解压缩啊!
-t :测试压缩文件的完整性,看有没有错误
-l :列出压缩文件的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!

xcat 文档名.xz

xz -d 文档名.xz

2.打包指令: tar

前面谈到的指令大多仅能针对单一文件来进行压缩,虽然 gzip, bzip2, xz 也能够针对目录来进行压缩,不过,这两个指令对目录的压缩指的是『将目录内的所有文件 "分别" 进行压缩』的动作!
而不像在 Windows 的系统可以使用类似 WinRAR 这一类的压缩软件来将好多数据『包成一个文件』的样式。这种将多个文件或目录包成一个大文件的指令功能,我们可以称呼他是一种『打包指令』!
那 Linux 鼎鼎大名的 tar 打包指令! tar 可以将多个目录或文 件打包成一个大文件,同时还可以透过 gzip/bzip2/xz 的支持,将该文件同时进行压缩。

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 来察看过程中被打包的档名(filename)
-t :察看打包文件的内容含有哪些档名,重点在察看『档名』就是了;
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开特别留意的是, -c, -t, -x 不可同时出现在一串指令列中。
-z :透过 gzip 的支持进行压缩/解压缩:此时档名最好为 *.tar.gz
-j :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2
-J :透过 xz 的支持进行压缩/解压缩:此时档名最好为 *.tar.xz, 特别留意, -z, -j, -J 不可以同时出现在一串指令列中
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
-f filename:-f 后面要立刻接要被处理的档名!建议 -f 单独写一个选项啰!(比较不会忘记)
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
其他后续练习会使用到的选项介绍:
-p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!

其实最简单的使用 tar 就只要记忆底下的方式即可:

  • 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
  • 查 询:tar -jtv -f filename.tar.bz2
  • 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

2.1 tar 压缩

2.1.1 使用 tar 加入 -z, -j 或 -J 的参数备份 /etc/ 目录

time tar -zpcv -f /root/etc.tar.gz /etc
time tar -jpcv -f /root/etc.tar.bz2 /etc
time tar -Jpcv -f /root/etc.tar.xz /etc


从上面的数据我们可以发现一件很有趣的事情,那就是每个文件名都没了根目录了!出现了警告讯息『tar:从成员名中删除了档名开头的 "/" )』
那为什么要拿掉根目录呢?主要是为了安全,我们使用 tar 备份的数据可能会需要解压缩回来使用,在 tar 所记录的文件名 (就是我们刚刚使用 tar -jtvf 所察看到的文档名) 那就是解压缩后的实际档名。
如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的档名就会变成『/tmp/etc/xxx』。但『如果没有拿掉根目录,解压缩后的档名就会是绝对路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!』
如此一来,你的原本的 /etc/ 底下的数据, 就会被备份数据所覆盖过去了!

2.1.2 全路径备份 -P 选项

tar -jpPcv -f /root/fullpath_etc.and.root.tar.xz /etc

如果加上 -P 选项,那么文件名内的根目录就会存在!不过,个人建议,还是不要加上 -P 这个选项来备份!
毕竟很多时候,我们备份是为了要未来追踪问题用的,倒不一定需要还原回原本的系统中!
所以拿掉根目录后,备份数据的应用会比较有弹性!也比较安全呢!

2.1.3 打包某目录,但不含该目录下的某些文件之作法

tar -jcv -f /root/root.tar.bz2 --exclude=/root/etc*

上面的指令是一整列的~其实你可以打成:『tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,
如果想要两行输入时,最后面加上反斜杠 () 并立刻按下[enter] , 就能够到第二行继续输入了。

2.1.4 仅备份比某个时刻还要新的文件 --newer-mtime 选项

1)先由 find 找出比 /etc/passwd 还要新的文件
find /etc -newer /etc/passwd
2)使用 tar 来进行打包!日期为上面看到的 2015/06/17
tar -jcv -f /root/etc.newwer.20200509.tar.bz2 --newer-mtime="2020/05/09" /etc/*

2.2 tar 查看压缩文档

tar -ztv -f /root/etc.tar.gz
tar -jtf -f /root/etc.root.tar.bz2
tar -Jtv -f /root/etc1.tar.xz
查阅 tar 文件的数据内容 (可查看文档名),与备份文件名有否根目录的意义

2.3 tar 解压压缩文档

2.3.1 解压到当前目录

tar -Jxv -f /root/etc1.tar.xz

2.3.2 解压到指定目录

tar -Jxv -f /root/ect1.tar.xz -C /tmp

2.3.3 仅解开单一文件的方法

1)先找到我们要的档名,假设解开 shadow 文件好了
tar -Jtv -f /root/etc.tar.xz | grep 'shadow'
2)将该文件解开!语法与实际作法如下:
tar -Jxv -f /root/etc.tar.xz etc/shadow -C /root/etc/shadow

posted @ 2021-12-06 11:40  自然有道  阅读(321)  评论(0编辑  收藏  举报