文件的打包、压缩与备份
文件的打包、压缩与备份
版本:centos7
常见的压缩文件扩展名汇总:
*.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 已经退流行了。这些指令通常仅能针对一个文件来压缩与解压缩,如此一来, 每次压缩与解压缩都要一大堆文件,岂不烦人?此时,那个所谓 的“打包软件, tar”就显的很重要啦!
单纯的 tar 功能仅是“打包”而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起, 如此一来提供使用者更方便并且更强大的压缩与打包功能!
LINUX下的基本压缩指令
gzip,zcat/zmore/zless/zgrep
gzip 可以说是应用度最广的压缩指令了!目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件。至于 gzip 所创建的压缩文件为 *.gz 的文件名喔!
[root@asahi1 ~]# gzip [-cdtv#] 文件名
选项与参数:
-c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
将services文件压缩
[root@asahi1 ~]# ll
total 660
-rw-------. 1 root root 1259 Feb 9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar 7 10:58 services
[root@asahi1 ~]# gzip -v services
services: 79.7% -- replaced with services.gz
将services文件解压缩
[root@asahi1 ~]# gzip -d services.gz
[root@asahi1 ~]# ll
total 660
-rw-------. 1 root root 1259 Feb 9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar 7 10:58 services
将解开的 services 用最佳的压缩比压缩,并保留原本的文件
[root@asahi1 ~]# gzip -9 -c services > services.gz
[root@asahi1 ~]# ll
total 12
-rw-------. 1 root root 1259 Feb 9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 29 Mar 7 11:03 services
-rw-r--r--. 1 root root 51 Mar 7 11:03 services.gz
再次创建的 services.gz 中,找出 http 这个关键字在哪几行?
[root@asahi1 ~]# zgrep -n 'http' services.gz
14:# http://www.iana.org/assignments/port-numbers
89:http 80/tcp www www-http # WorldWideWeb HTTP
90:http 80/udp www www-http # HyperText Transfer Protocol
91:http 80/sctp # HyperText Transfer Protocol
————下面省略————
bzip2,bzcat/bzmore/bzless/bzgrep
若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是 为了取代 gzip 并提供更佳的压缩比而来的。
[root@asahi1 ~]# bzip2 [-cdkzv#] 文件名
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留原始文件,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
将刚刚留下来的services 以 bzip2 压缩
[root@asahi1 ~]# bzip2 -v services
services: 5.409:1, 1.479 bits/byte, 81.51% saved, 670293 in, 123932 out.
[root@asahi1 ~]# ll
total 264
-rw-------. 1 root root 1259 Feb 9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 123932 Mar 7 11:05 services.bz2
-rw-r--r--. 1 root root 135489 Mar 7 11:06 services.gz
将刚刚的文件解压缩
[root@asahi1 ~]# bzip2 -d services.bz2
将解开的 services 用最佳的压缩比压缩,并保留原本的文件
[root@asahi1 ~]# bzip2 -9 -c services > services.bz2
[root@asahi1 ~]# ll
total 920
-rw-------. 1 root root 1259 Feb 9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar 7 11:05 services
-rw-r--r--. 1 root root 123932 Mar 7 11:25 services.bz2
-rw-r--r--. 1 root root 135489 Mar 7 11:06 services.gz
xz, xzcat/xzmore/xzless/xzgrep
虽然 bzip2 已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了 xz 这个压缩比更高的软件!这个软件的用法也跟 gzip/bzip2 几乎一模一 样!
[root@asahi1 ~]# xz [-dtlkc#] 文件名
选项与参数:
-d :就是解压缩啊!
-t :测试压缩文件的完整性,看有没有错误
-l :列出压缩文件的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!
刚刚由 bzip2 所遗留下来的services通过 xz 来压缩!
[root@asahi1 ~]# xz -v services
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149
[root@asahi1 ~]# ll
total 364
-rw-------. 1 root root 1259 Feb 9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 123932 Mar 7 11:25 services.bz2
-rw-r--r--. 1 root root 135489 Mar 7 11:06 services.gz
-rw-r--r--. 1 root root 99608 Mar 7 11:05 services.xz
列出这个压缩文件的信息,然后读出这个压缩文件的内容
[root@asahi1 ~]# xz -l services.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 97.3 KiB 654.6 KiB 0.149 CRC64 services.xz
将他解压缩吧!
[root@asahi1 ~]# xz -d services.xz
[root@asahi1 ~]# ll
total 920
-rw-------. 1 root root 1259 Feb 9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar 7 11:05 services
-rw-r--r--. 1 root root 123932 Mar 7 11:25 services.bz2
-rw-r--r--. 1 root root 135489 Mar 7 11:06 services.gz
保留原文件的文件名,并且创建压缩文件!
[root@asahi1 ~]# xz -kv services
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149
[root@asahi1 ~]# ll
total 1020
-rw-------. 1 root root 1259 Feb 9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar 7 11:05 services
-rw-r--r--. 1 root root 123932 Mar 7 11:25 services.bz2
-rw-r--r--. 1 root root 135489 Mar 7 11:06 services.gz
-rw-r--r--. 1 root root 99608 Mar 7 11:05 services.xz
打包指令:tar
这种将多个文件或目录包成一个大文件的指令功能,我们可以称呼他是一种“打包指令”!!
[root@asahi1 ~]# tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename <==打包与压缩
[root@asahi1 ~]# tar [-z|-j|-J] [tv] [-f 既有的 tar文件名] <==察看文件名
[root@asahi1 ~]# 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 -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
有事没事备份一下 /etc 这个目录是件好事!备份 /etc 最简单的方法就是使用 tar !
[root@asahi1 ~]# time tar -zpcv -f /root/etc.tar.gz /etc
[root@asahi1 ~]# time tar -jpcv -f /root/etc.tar.bz2 /etc
[root@asahi1 ~]# time tar -Jpcv -f /root/etc.tar.xz /etc
[root@asahi1 ~]# ll -h /root/etc.tar.*
-rw-r--r--. 1 root root 8.8M Mar 7 16:10 /root/etc.tar.bz2
-rw-r--r--. 1 root root 10M Mar 7 16:07 /root/etc.tar.gz
-rw-r--r--. 1 root root 7.2M Mar 7 16:10 /root/etc.tar.xz
[root@asahi1 ~]# du -sh /etc/
33M /etc/
[root@asahi1 ~]# tar -ztv -f /root/etc.tar.gz
--------(前面省略)-----------
drwxr-xr-x root/root 0 2018-10-31 05:23 etc/glvnd/egl_vendor.d/
-rw-r--r-- root/root 1982 2020-10-14 00:13 etc/vimrc
-rw-r--r-- root/root 19 2022-03-01 10:32 etc/subuid-
-rw-r--r-- root/root 19 2022-03-01 10:32 etc/subgid-
如果加上 -v 这个选项时,详细的文件权限/属性都会被列出来!如果只是想要知 道文件名而已, 那么就将 -v 拿掉即可。从上面的数据我们可以发现一件很有趣的事 情,那就是每个文件名都没了根目录了!这也是出现的那个警告讯息“tar: Removing leading /' from member names(移除了文件名开头的
/' )所告知的情况!
那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需 要解压缩回来使用, 在 tar 所记录的文件名 (就是我们刚刚使用 tar -jtvf 所察看到的文 件名) 那就是解压缩后的实际文件名。 如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的文件名就会变成“/tmp/etc/xxx”。 但“如果没有拿掉根目录,解压缩 后的文件名就会是绝对路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!”如此 一来,你的原本的 /etc/ 下面的数据, 就会被备份数据所覆盖过去了!
如果你确定你就是需要备份根目录到 tar 的文件中,那可以使用 -P (大写) 这个选项,请看下面的例子分析:
[root@study ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
[root@study ~]# tar -jtf /root/etc.and.root.tar.bz2
/etc/locale.conf
/etc/hostname
/etc/aliases.db
# 这次查阅文件名不含 -v 选项,所以仅有文件名而已!没有详细属性/权限等参数。
有发现不同点了吧?如果加上 -P 选项,那么文件名内的根目录就会存在喔!不过,个人建议,还是不要加上 -P 这个选项来备份! 毕竟很多时候,我们备份是为 了要未来追踪问题用的,倒不一定需要还原回原本的系统中! 所以拿掉根目录后,备份数据的应用会比较有弹性!也比较安全呢!
如果只想要解开打包文件内的其中一个文件而已呢
[root@study ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
[root@study ~]# tar -jxv -f 打包档.tar.bz2 待解开文件名
[root@asahi1 ~]# tar -jxv -f etc.tar.bz2 etc/shadow
etc/shadow
[root@asahi1 ~]# ll etc
total 4
----------. 1 root root 563 Mar 1 10:34 shadow
假设我们想要打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头 的文件,因为该文件都是刚刚我们才创建的备份文件嘛! 而且假设这个新的打包文件 要放置成为 /root/system.tar.bz2 ,当然这个文件自己不要打包自己 (因为这个文件放置 在 /root 下面啊!),此时我们可以通过 --exclude 的帮忙! 那个 exclude 就是不包含的 意思!所以你可以这样做:
[root@study ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
>--exclude=/root/system.tar.bz2 /etc /root
上面的指令是一整列的~其实你可以打成:“tar -jcv -f /root/system.tar.bz2 -- exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root”,如果想要两行输入时,最后面 加上反斜线 (\) 并立刻按下 [enter] , 就能够到第二行继续输入了。