一、压缩技术:
其实文件里面有相当多的“空间”存在,并不是完全填满的,而“压缩”的技术就是将这些“空间”填满,以让整个文件占用的容量下降!
二、你在WWW网站上面“看的到的数据”,在经过网络传输时,使用的是“压缩过的数据”,等到这些压缩过的数据到达你的计算机主机时,再进行解压缩,由于目前的计算机运算速度相当的快速,因此其实在网页浏览的时候,时间都是花在“数据的传输”上面,而不是CPU的运算啦!
常见的压缩文件扩展名:
.Z compress 程序压缩的文件;
.zip zip 程序压缩的文件;
.gz gzip 程序压缩的文件;
.bz2 bzip2 程序压缩的文件;
.xz xz 程序压缩的文件;
.tar tar 程序打包的数据,并没有压缩过;
.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩
一、gzip可以解开compress,zip与gzip等软件所压缩的文件。
[dmtsai@study ~]$ gzip [-cdtvm] 文件名# 解压文件
[dmtsai@study ~]$ zcat 文件名.gz
# 选项与参数:
# -c:将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
# -d:解压缩的参数;
# -t:可以用来检验一个压缩文件的一致性~看看文件有无错误;
# -v:可以显示出原文件/压缩文件的压缩比等信息;
# -m:m为数字,代表压缩等级,-1最快,但是压缩比最差;-9最慢,但是压缩比最好!默认是-6
# 范例一:找出/etc下面(不含子目录)容量最大的文件,并将它复制到/tmp,然后以gzip压缩
[dmtsai@study ~]$ ls -ldSr /etc/*
# S:文件大小降序排序
# r:将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;
# l:输出文件的权限属性
# d:仅列出目录本身,而不是列出目录内的文件数据(常用)
.....(前面省略).....
-rw-r--r--. 1 root root 25213 Jun 10 2014 /etc/dnsmasq.conf
-rw-r--r--. 1 root root 69768 May 4 17:55 /etc/ld.so.cache
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
[dmtsai@study ~]$ cd /tmp
[dmtsai@study tmp]$ cp /etc/services .
[dmtsai@study tmp]$ gzip -v services
services: 79.7% -- replaced with services.gz
[dmtsai@study tmp]$ ll /etc/services /tmp/services*
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 dmtsai dmtsai 136088 Jun 30 18:40 /tmp/services.gz
二、当你使用gzip进行压缩时,在默认的状态下原本的文件会被压缩成为.gz的文件名,原始文件就不再存在了。此外,使用gzip压缩的文件在Windows系统中,可以被WinRAR/7zip这个软件解压缩呢!
# 范例二:由于services是文本文件,请将范例一的压缩文件的内容读出来!
[dmtsai@study tmp]$ zcat services.gz# 由于services这个原本的文件是文本文件,因此我们可以尝试使用zcat/zmore/zless去读取!此时屏幕上会显示servcies.gz解压缩之后的原始文件内容!
# 范例三:将范例一的文件解压缩
[dmtsai@study tmp]$ gzip -d services.gz# 与gzip相反,gzip -d会将原本的.gz删除,回复到原本的services文件。
# 范例四:将范例三解开的services用最佳的压缩比压缩,并保留原本的文件
[dmtsai@study tmp]$ gzip -9 -c services > services.gz
# -c可以将原本要转成压缩文件的数据内容,将它变成文字类型从屏幕输出,然后通过大于(>)符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够创建出压缩挡了。只是文件名也要自己写
# 范例五:由范例四再次创建的services.gz中,找出http这个关键字在哪几行?
[dmtsai@study tmp]$ 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
.....(下面省略).....
三、cat/more/less可以使用不同的方式来读取纯文本文件,zcat/zmore/zless则可以对应于cat/more/less的方式来读取纯文本文件被压缩后的压缩文件!由于gzip这个压缩指令主要想要用来取代compress,所以不但compress的压缩文件可以使用gzip来解开,同时zcat这个指令可以同时读取compress与gzip的压缩文件呦!
四、如果你还想要从文字压缩文件当中找数据的话,可以通过egrep来搜寻关键字
五、如果你还有备份数据使用的是compress创建出来的.Z文件,使用znew可以将该文件转成gzip的格示
一、bzip2为了取代gzip并提供更佳的压缩比
[dmtsai@study ~]$ bzip2 [-cdkzvm] 文件名
[dmtsai@study ~]$ bzcat 文件名.bz2
# 选项与参数:
# -c:将压缩的过程产生的数据输出到屏幕上!
# -d:解压缩的参数
# -k:保留原始文件,而不会删除原始的文件喔!
# -z:压缩的参数(默认值,可以不加)
# -v:可以显示出原文件/压缩文件的压缩比等信息;
# -m:与gzip相同,都是用于计算压缩比的参数,-9最佳,-1最快!
# 范例一:将刚刚gzip范例留下来的/tmp/services以bzip2压缩
[dmtsai@study tmp]$ bzip2 -v services
services: 5.409:1, 1.479 bits/Byte, 81.51% saved, 670293 in, 123932 out.
[dmtsai@study tmp]$ ls -l services*
-rw-r--r--. 1 dmtsai dmtsai 123932 Jun 30 18:40 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
# 此时services会变成services.bz2之外,你也可以发现bzip2的压缩比要较gzip好喔!!
# 压缩率由gzip的79%提升到bzip2的81%
# 范例二:将范例一的文件内容读出来!
[dmtsai@study tmp]$ bzcat services.bz2
# 范例三:将范例一的文件解压缩
[dmtsai@study tmp]$ bzip2 -d services.bz2
# 范例四:将范例三解开的services用最佳的压缩比压缩,并保留原本的文件
[dmtsai@study tmp]$ bzip2 -9 -c services > services.bz2
bzip2连选项与参数都跟gzip一样!只是扩展名由.gz变成.bz2而已
xz压缩比更高,用法也跟gzip/bzip2几乎一模一样!
[dmtsai@study ~]$ xz [-dtlkcm] 文件名
[dmtsai@study ~]$ xcat 文件名.xz
# 选项与参数:
# -d:就是解压缩啊!
# -t:测试压缩文件的完整性,看有没有错误
# -l:列出压缩文件的相关信息
# -k:保留原本的文件不删除~
# -c:同样的,就是将数据由屏幕上输出的意思!
# -m:同样的,也有较佳的压缩比的意思!
# 范例一:将刚刚由bzip2所遗留下来的/tmp/services通过xz来压缩!
[dmtsai@study tmp]$ xz -v services
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149
[dmtsai@study tmp]$ ls -l services*
-rw-rw-r--. 1 dmtsai dmtsai 123932 Jun 30 19:09 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
-rw-r--r--. 1 dmtsai dmtsai 99608 Jun 30 18:40 services.xz
# 各位观众!看到没有啊!!容量又进一步下降的更多耶!好棒的压缩比!
# 范例二:列出这个压缩文件的信息,然后读出这个压缩文件的内容
[dmtsai@study tmp]$ xz -l services.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 97.3 KiB 654.6 KiB 0.149 CRC64 services.xz
# 竟然可以列出这个文件的压缩前后的容量,真是太人性化了!这样观察就方便多了!
[dmtsai@study tmp]$ xzcat services.xz
# 范例三:将他解压缩吧!
[dmtsai@study tmp]$ xz -d services.xz
# 范例四:保留原文件的文件名,并且创建压缩文件!
[dmtsai@study tmp]$ xz -k services
通过time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz]
去执行运算结果,结果发现这三个指令的执行时间依序是:0.019s,0.042s,0.261s,看最后一个数字!差了10倍的时间耶!所以,如果你并不觉得时间是你的成本考虑,那么使用xz会比较好!如果时间是你的重要成本,那么gzip恐怕是比较适合的压缩软件喔!
一、虽然gzip,bzip2,xz也能够针对目录来进行压缩,不过,这几个指令对目录的压缩指的是将目录内的所有文件分别进行压缩的动作!
二、tar可以将多个目录或文件打包成一个大文件,同时还可以通过gzip/bzip2/xz的支持,将该文件同时进行压缩!目前Windows的WinRAR也支持.tar.gz文件名的解压缩呢!
三、使用man tar
查询更多选项,常用的选项与参数如下:
[root@www ~]tar [-j|-z] [cv] [-f 创建的档名] filename... <==打包与压缩
[root@www ~]tar [-j|-z] [tv] [-f 创建的档名] <==察看档名
[root@www ~]tar [-j|-z] [xv] [-f 创建的档名] [-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 -j<u>c</u>v -f filename.tar.bz2 要被压缩的文件或目录名称
查询:tar -j<u>t</u>v -f filename.tar.bz2
解压缩:tar -j<u>x</u>v -f filename.tar.bz2 -C 欲解压缩的目录
filename.tar.bz2是我们自己取的文件名,tar并不会主动的产生创建的文件名喔!我们要自订啦!所以扩展名就显的很重要了!如果不加[-z|-j|-J]
的话,文件名最好取为.tar
即可。如果是-j
选项,代表有bzip2
的支持,因此文件名最好就取为.tar.bz2
,因为bzip2会产生.bz2的扩展名!至于如果是加上了-z的gzip的支持,那文件名最好取为*.tar.gz喔!
由于
-f filename
是紧接在一起的,过去很多文章常会写成-jcvf filename
,这样是对的,但由于选项的顺序理论上是可以变换的,所以很多读者会误认为-jvfc filename
也可以~事实上这样会导致产生的文件名变成c !因为-fc
嘛!所以建议您在学习tar时,将-f filename
与其他选项独立出来
四、使用tar加入-z,-j或-J的参数备份/etc/目录
[dmtsai@study ~]$ su - # 因为备份/etc需要root的权限,否则会出现一堆错误
[root@study ~]time tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading '/' from member names # 注意这个警告讯息
/etc/
....(中间省略)....
/etc/hostname
/etc/aliases.db
real 0m0.799s # 多了time会显示程序运行的时间!看real就好了!花去了0.799s
user 0m0.767s
sys 0m0.046s
# 由于加上-v这个选项,因此正在作用中的文件名就会显示在屏幕上。
# 至于-p的选项,重点在于“保留原本文件的权限与属性”之意。
[root@study ~]time tar -jpcv -f /root/etc.tar.bz2 /etc
....(前面省略)....
real 0m1.913s
user 0m1.881s
sys 0m0.038s
[root@study ~]time tar -Jpcv -f /root/etc.tar.xz /etc
....(前面省略)....
real 0m9.023s
user 0m8.984s
sys 0m0.086s
# 显示的讯息会跟上面一模一样啰!不过时间会花比较多!使用了-J时,会花更多时间
[root@study ~]ll /root/etc*
-rw-r--r--. 1 root root 6721809 Jul 1 00:16 /root/etc.tar.bz2
-rw-r--r--. 1 root root 7758826 Jul 1 00:14 /root/etc.tar.gz
-rw-r--r--. 1 root root 5511500 Jul 1 00:16 /root/etc.tar.xz
[root@study ~]du -sm /etc
28 /etc # 实际目录约占有 28MB 的意思!
五、要察看由tar所创建的打包文件内部的文件名
[root@study ~]tar -jtv -f /root/etc.tar.bz2
....(前面省略)....
-rw-r--r-- root/root 131 2015-05-25 17:48 etc/locale.conf
-rw-r--r-- root/root 19 2015-05-04 17:56 etc/hostname
-rw-r--r-- root/root 12288 2015-05-04 17:59 etc/aliases.db
从上面的数据我们可以发现:每个文件名都没了根目录了!这也是上一个练习中出现的那个警告讯息tar: Removing leading /' from member names
(移除了文件名开头的/’ )所告知的情况!那为什么要拿掉根目录呢?主要是为了安全!我们使用tar备份的数据可能会需要解压缩回来使用,在tar所记录的文件名(就是我们刚刚使用tar -jtvf
所察看到的文件名)那就是解压缩后的实际文件名。如果拿掉了根目录,假设你将备份数据在/tmp
解开,那么解压缩的文件名就会变成/tmp/etc/xxx
。但如果没有拿掉根目录,解压缩后的文件名就会是绝对路径,亦即解压缩后的数据一定会被放置到/etc/xxx
去!如此一来,你的原本的/etc/下面的数据, 就会被备份数据所覆盖过去了!想像一个状况,你备份的数据是两年前的旧版CentOS 6.x,你只是想要了解一下过去的备份内容究竟有哪些数据而已,结果一解开该文件,却发现你目前新版的CentOS 7.x下面的/etc被旧版的备份数据覆盖了!如果你确定你就是需要备份根目录到tar的文件中,那可以使用-P(大写)这个选项
# 范例:将档名中的(根)目录也备份下来,并察看一下备份档的内容档名
[root@www ~]tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
....中间过程省略....
[root@www ~]tar -jtf /root/etc.and.root.tar.bz2
/etc/dbus-1/session.conf
/etc/esd.conf
/etc/crontab
# 这次查阅档名不含 -v 选项,所以仅有档名而已!没有详细属性/权限等参数。
六、将备份的数据解压缩,并考虑特定目录的解压缩动作(-C选项的应用)
[root@study ~]tar -jxv -f /root/etc.tar.bz2
[root@study ~]ll
....(前面省略)....
drwxr-xr-x. 131 root root 8192 Jun 26 22:14 etc
....(后面省略)....
此时该打包文件会在“本目录下进行解压缩”,如果你想要将该文件在/tmp下面解开,可以cd /tmp
后,再下达上述的指令。如果你像指定欲解开的目录可以使用-C这个选项:
[root@study ~]tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@study ~]ll /tmp
....(前面省略)....
drwxr-xr-x. 131 root root 8192 Jun 26 22:14 etc
....(后面省略)....
七、仅解开单一文件的方法:如果我只想要解开打包文件内的其中一个文件而已,你只要使用-jtv找到你要的文件名,然后将该文件名解开即可:
# 1. 先找到我们要的档名,假设解开shadow文件好了:
[root@www ~]tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
-r-------- root/root 1230 2008-09-29 02:21:20 etc/shadow-
-r-------- root/root 622 2008-09-29 02:21:20 etc/gshadow-
-r-------- root/root 636 2008-09-29 02:21:25 etc/gshadow
-r-------- root/root 1257 2008-09-29 02:21:25 etc/shadow <==这是我们要的!
# 先搜寻重要的档名!其中grep是『撷取』关键字的功能!那个管线|配合grep可以撷取关键字的意思!
# 2. 将该文件解开!语法与实际作法如下:
[root@www ~]tar -jxv -f 打包档.tar.bz2 待解开档名
[root@www ~]tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@www ~]ll etc
total 8
-r-------- 1 root root 1257 Sep 29 02:21 shadow <==呦喝!只有一个文件啦!
# 在本例中,你不能写成 /etc/shadow!因为记录在etc.tar.bz2内的档名!
八、打包某目录,但不含该目录下的某些文件:假设我们想要打包/etc/ /root这几个重要的目录,但却不想要打包/root/etc*开头的文件,而且假设这个新的打包文件要放置成为/root/system.tar.bz2,当然这个文件自己不要打包自己(因为这个文件放置在 /root 下面啊!),此时我们可以通过–exclude的帮忙! 那个exclude就是不包含的意思!所以你可以这样做:
[root@www ~]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] ,就能够到第二行继续输入了。通过--exclude="file"
,可以将几个特殊的文件或目录移除在打包之外
九、仅备份比某个时刻还要新的文件:使用--newer-mtime
即可,其实有两个选项,一个是--newer
,表示后续的日期包含mtime与ctime;另一个就是--newer-mtime
,表示仅是mtime
# 1. 先由find找出比/etc/passwd还要新的文件
[root@www ~]find /etc -newer /etc/passwd
....(过程省略)....
# 此时会显示出比/etc/passwd这个文件的mtime还要新的档名,这个结果在每部主机都不相同!
[root@www ~]ll /etc/passwd
-rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd
# 2. 好了,那么使用tar进行打包吧!日期为上面看到的2008/09/29
[root@www ~]tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 \
> --newer-mtime="2008/09/29" /etc/*
....(中间省略)....
/etc/smartd.conf <==真的有备份的文件
....(中间省略)....
/etc/yum.repos.d/ <==目录都会被记录下来!
tar: /etc/yum.repos.d/CentOS-Base.repo: file is unchanged; not dumped
# 最后行显示的是『没有被备份的』,亦即not dumped
# 3. 显示出文件即可
[root@www ~]tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | \
> grep -v '/$'
# 透过这个命令可以呼叫出tar.bz2内的结尾非/的档名!就是我们要的啦!
十、基本名称:tarfile,tarball:tar打包出来的文件有没有进行压缩所得到文件名不同,如果只打包就是tar -cv -f file.tar
,这个文件我们称呼为tarfile 。如果还有压缩,例如tar -jcv -f file.tar.bz2
时,我们就称呼为tarball
十一、tar除了可以将数据打包成为文件之外,还能够将文件打包到某些特别的设备去,举例来说,磁带机由于是一次性读取/写入的设备,因此我们不能够使用类似cp等指令来复制!那如果想要将/home,/root,/etc备份到磁带机(/dev/st0)时,就可以使用:tar -cv -f /dev/st0 /home /root /etc
十二、特殊应用:利用管线命令与数据流
在tar的使用中,有一种特殊方式:通过标准输入输出的数据流重导向(standard input/standard output),以及管线命令(pipe)的方式,将待处理的文件一边打包一边解压缩到目标目录去。
# 1. 将/etc整个目录一边打包一边在/tmp解开
[root@www ~]cd /tmp
[root@www tmp]tar -cvf - /etc | tar -xvf -# 指令里面的-表示那个被打包的文件
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
# 要注意的地方在於输出档变成 - 而输入档也变成 - ,又有一个 | 存在~
# 这分别代表 standard output, standard input 与管线命令啦!
# 简单的想法中,你可以将 - 想成是在内存中的一个装置(缓冲区)。
十三、系统上有非常多的重要目录需要进行备份,而且其实我们也不建议你将备份数据放置到/root目录下! 假设目前你已经知道重要的目录有下面这几个:
/etc/ (配置文件)
/home/ (使用者的主文件夹)
/var/spool/mail/ (系统中,所有帐号的邮件信箱)
/var/spool/cron/ (所有帐号的工作排成配置文件)
/root (系统管理员的主文件夹)
我们也知道,/home/loop*不需要备份,而且/root下面的压缩文件也不需要备份,另外假设你要将备份的数据放置到/backups,并且该目录仅有root有权限进入!此外,每次备份的文件名都希望不相同,例如使用:backup-system-20150701.tar.bz2
之类的文件名来处理。那你该如何处理这个备份数据呢?
# 1. 先处理要放置备份数据的目录与权限:
[root@www ~]mkdir /backups
[root@www ~]chmod 700 /backups
[root@www ~]ll -d /backups
drwx------ 2 root root 4096 Nov 30 16:35 /backups
# 2. 假设今天是2009/11/30,则创建备份的方式如下:
[root@www ~]tar -jcv -f /backups/backup-system-20091130.tar.bz2 \
> --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* \
> /etc /home /var/spool/mail /var/spool/cron /root
....(过程省略)....
[root@www ~]ll -h /backups/
-rw-r--r-- 1 root root 8.4M Nov 30 16:43 backup-system-20091130.tar.bz2
十四、解压缩后的SELinux课题:如果因为某些缘故,你的系统必须要以备份的数据来回填到原本的系统中,那么要特别注意复原后的系统的SELinux问题!尤其是在系统文件上面!例如/etc
下面的文件群。SELinux是比较特别的权限设置,你只要知道,SELinux的权限问题“可能会让你的系统无法存取某些配置文件内容,导致影响到系统的正常使用权”。
问题:通过tar去备份了/etc的数据,然后尝试在另一部系统上面复原回来。复原倒是没问题,但是复原完毕之后,无论如何就是无法正常的登陆系统!明明使用单人维护模式去操作系统时,看起来一切正常~但就是无法顺利登陆。大部分原因就是因为/etc/shadow这个密码文件的SELinux类型在还原时被更改了!导致系统的登陆程序无法顺利的存取它,才造成无法登陆的窘境。处理方式有这几个: