文件的打包、压缩与备份

文件的打包、压缩与备份

版本: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] , 就能够到第二行继续输入了。

posted @   Asahi_煦  阅读(600)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示