回顾上一章所学到的内容有如何制作软RAID及LVM,在生产环境中,软RAID一点用处都是没有的,关键是要了解一下RAIDLevel的机制,及等级意义是什么。另一个就是LVM,那么LVM就是一个逻辑设备,提供卷管理操作(volume),将一个或多个底层物理设备,组织成为逻辑设备。在逻辑卷中有一种为快照的功能,而快照功能就是让我们在备份文件时更加流畅而设定的,其本身就不具有备份功能。那么在接下来的章节中讲述的是压缩与解压缩的工具。
一、压缩
在Windows当中,压缩与解压缩是很常见的操作。国内厂商当中,无论流氓还是不流氓,都有其各自发售的压缩软件,使得在Windows中百花齐放,在Linux当中也是有很多的压缩工具,不过我们需要注意到的是一般压缩的是通常为文本编码格式的文件,如果是那种二进制文件的话,其压缩比可能不是很尽如人意,更重要的是,如果该数据文件已经被压缩过,那么则不能再用压缩工具进行压缩,除了浪费CPU的时钟周期以外,几乎没有什么作用。比如压缩一个图片或电影,你会发现其压缩比是非常小的,那么所谓的压缩比就是压缩前与压缩后的体积大小之比例。通过分析文本数据或二进制数据等,实现是通过数据压缩都是由数据存储模式来实现的,真正实现压缩时是有很多的压缩算法来对文本文件进行压缩。
对于不同的压缩算法,它们对于文本替换及标记的方式有所不同,所以带来的结果为压缩比很有可能就会不一样。有些算法很精细,压缩比就很高一些,有些算法很粗略,压缩比会差一些,迄今为止,有很多的经典压缩算法被使用着。
其实在这个世界上,处处充满了妥协与折中,那么压缩的目的也无非就是用时间换空间,用的是CPU的时间去换取磁盘的空间,CPU使用那些算法去处理该数据,需要一个应用程序对源数据文件进行分析,之后存储的容量小一些,而这个过程是需要大量的CPU时钟周期来进行计算,因为压缩的算法对CPU的占用比来说是非常大的,带来的结果就是该文件的存储容量会更小一些,所以这是用时间换空间,具体哪一个价值更高,看你的需要,对于桌面客户端来讲,CPU的空闲时间还是比较大的,那么用时间换空间是比较划算的。而对于服务器来讲,CPU的时间划分都很珍贵,而且存储容量足够的话,用时间换取空间的方式是非常不划算的。
压缩比 目的:时间 换 空间 CPU时间 --> 磁盘空间 不同的压缩算法,它们对于文本的替换和标记的方式不同,带来的结果与压缩比的结果有可能不一样。
二、压缩工具
对于Linux来说,有很多的压缩工具,比如:
compress/uncompress .Z gzip/gunzip .gz bzip/bunzip .bz2 xz/unxz .xz lzma/unlzma .lzma zip/unzip tar, cpio
compress压缩工具是早期Unix以及Linux系统中广泛使用的,gzip压缩工具是现在使用最为广泛的,而bzip2是后来出现的,比gzip的压缩比更大一些,但实际压缩比与前者相比并不是有特别的明显,有些方面甚至还不如gzip,xz是新晋着,刚出现的一种压缩工具,而且越来越受欢迎,撼动了gzip的地位,因为该压缩工具确实有很大改进,且优势非常明显。
还有一些归档的工具,例如zip,既能归档又能压缩,还有一个就是纯粹归档的,tar和cpio,那么接下来就开始介绍这几款工具各自的使用。
2.1 gzip/gunzip/zcat
那么以上除了gzip和gunzip之外,还有一个zcat,在压缩时可用该命令直接压缩,不需要任何选项,其命令格式为:
gzip [OPTION]... FILE...
该常用的命令选项为:
-d:解压缩,相当于gunzip; -#:指定解压比,默认是6,数字越大,压缩比越大(1-9) -c:输出压缩后的结果,原文件给予保留;(默认为标准输出) gzip -c FILE > /PATH/TO/SOMEFILE.gz 压缩完成后将源文件删除;解压缩也是如此;
如果-c默认输出到标准设备的话,则大量二进制代码都是显示在该设备上时,可以使用reset命令解决此问题。
(重置terminal命令:reset)
那么现在我们将/var/log/message文件复制到/tmp目录下,对其实行压缩。
# cp /var/log/messages /tmp/ # ll -h total 828K -rw------- 1 root root 828K Mar 7 14:06 messages
可以看出,该文件大小为800多K,之后我们使用gzip命令,不用加任何选项。
# gzip messages # ll -h total 112K -rw------- 1 root root 109K Mar 7 14:06 messages.gz
可以看出,该文件压缩之后的结果以及将原文件进行删除,这就是用时间换空间后的结果,对于文本文件来讲,压缩比是非常明显的,那么解压缩使用gunzip命令,直接跟上其压缩文件。
# gunzip messages.gz # ll -h total 828K -rw------- 1 root root 828K Mar 7 14:06 messages
那么还原回原来的文件时,其压缩文件也是会被删除。gzip压缩时,它将会把该压缩文件自动添加.gz后缀,在默认情况下,gzip2的后缀必须就是.gz,如果不是.gz结尾的文件,用gunzip解压缩时会报告说这不是.gz的文件,对于文件的后缀名,Linux中并没有太大意义,但在这里是有特殊意义的。
zcat命令是能够将gzip压缩的文件,找一个临时位置给解压缩出来,并将临时文件的内容展示给用户,当然,如果压缩的文件特别大的话,不建议使用,仅适用于较小的文件。我们重新压缩message文件,使用zcat命令。
# gzip message # zcat message.gz
几乎所有在互联网上的源码包,都是提供的为压缩格式的,原因有两点。第一,节约空间;第二,可以节约带宽。
2.2 bzip2/bunzip2/bzcat
bzip2的操作与特性几乎和gzip相同,那么其命令格式为:
bzip2 [OPTION]... FILE...
该命令常用选项为:
-d:解压缩; -#:指定压缩比;默认是6;数字越大压缩比越大(1-9); -k:keep,保留原文件;
那么bip2的压缩后缀名为.bz2,例如:
# bzip2 messages2 # ll -h total 168K -rw------- 1 root root 54K Mar 7 15:59 messages2.bz2 -rw------- 1 root root 109K Mar 7 14:06 messages.gz
解压缩也是一样,使用-d或者使用bunzip2都是可以的,而且具有识别能力,直接可以定位到.bz2格式中。
# bzip2 -d messages2.bz2 # ll -h total 976K -rw------- 1 root root 861K Mar 7 15:59 messages2 -rw------- 1 root root 109K Mar 7 14:06 messages.gz
2.3 xz/unxz/xzcat
对于xz而言,与此前讲述的bzip2或者gzip都是一样的,它也是会删除源文件的,其命令格式为:
xz [OPTION]... FILE...
该命令常用选项为:
-d:解压缩; -#:指定压缩比;默认是6;数字越大压缩比越大(1-9); -k:保留源文件;
我们使用xz去复制message2文件为message3文件,然后进行压缩。
# cp messages2 messages3 # bzip2 messages2 # xz messages3 # ll -h total 216K -rw------- 1 root root 54K Mar 7 15:59 messages2.bz2 -rw------- 1 root root 46K Mar 7 16:19 messages3.xz -rw------- 1 root root 109K Mar 7 14:06 messages.gz
看的出来,比bzip2的压缩比更大,而且对于执行效率来说,xz快一些。
需要注意的是,上述这三款工具,只能压缩文件,不能压缩目录。但是在Windows中使用WinRAR就可以,对于Linux来说,如果想压缩该目录的话,需要先事先做归档操作。
三、归档
归档简单来讲无非就是将多个文件打包成一个文件,例如说有很多的书,你可以使用纸箱子将其进行打包,那么这种操作我们称之为归档操作,其看到的结果就是,在你眼前就是一个纸箱子,而不是很多的书了,但有一个坏处就是归档操作并不能减小磁盘容量,反而会增加磁盘空间。因为打包的工具也是占用磁盘容量的,所以我们也要使用压缩工具来减少对磁盘的占用比,因此归档与压缩通常要结合起来使用。
归档的常用工具有两个,一个为tar另一个为cpio。后者不多见,有可能在特殊场景中使用,而在互联网上经常用的是tar工具,这里的tar为GNU `tar`,为开源版本,重现实现的归档工具,出于使用的目的,了解最简单的使用方法就可以。cpio用到时再会讲述。
那么tar命令格式为:
tar命令: tar [OPTION]... FILE...
在这里需要说明一下,对于tar命令,其选项可以不带 -
,因此可以省略。
3.1 创建归档
使用-c
来创建归档,同时我们也要使用-f
选项来指明一些文件。注意,不能写反,否则就变成-c的参数了。
(1) 创建归档 -c -f /PATH/TO/SOMEFILE.tar FILE... -cf /PATH/TO/SOMEFILE.tar FILE...
3.2 展开归档
使用-x
来展开归档,同样,我们也要使用-f
来指明一些文件,那么如果想要展开至其它目录的话,使用-C
选项,用于展开至何处。
(2) 展开归档 -xf /PATH/TO/SOMEFILE.tar -xf /PATH/TO/SOMEFILE.tar -C /PATH/TO/SOMEDIR -C:展开到其指定的目录
3.3 查看归档文件中的文件列表
如果不展开归档查看文件的话,就像在地铁过安检口一样,检查行李时不可能直接打开查看有什么管制工具,它们则需要一个机器用来查看并透视该行李里面有什么物品,使用-t
选项来进行查看归档文件中的文件列表,同样,-f
也是指明文件。
(3) 查看归档文件的文件列表 -tf /PATH/TO/SOMEFILE.tar
四、归档压缩
由于tar命令只能用于归档,而不能用于压缩,我们可以在归档之后还可以施行压缩,例如,我们将message文件全部解压,然后进行归档。
# tar cf message.tar messages messages2 messages3 # ll -h total 6.8M -rw------- 1 root root 1.7M Mar 7 19:22 messages -rw------- 1 root root 861K Mar 7 15:59 messages2 -rw------- 1 root root 861K Mar 7 16:19 messages3 -rw-r--r-- 1 root root 3.4M Mar 7 19:22 message.tar
以上可以看出,归档其实可以用作备份功能,其特性是在归档之后并不删除源文件,但是并不具有压缩的特性,我们可以在该归档文件上进行压缩。
# xz message.tar # ll -h -rw-r--r-- 1 root root 47K Mar 7 19:22 message.tar.xz
看的出来,源文件已被删除,但是毕竟已经实现了压缩功能,而且是将多个文件一同压缩的,不过已经看的出来这需要两步完成,我们来总结一下:
归档完成后通常需要压缩,结果此前的压缩工具,就能实现压缩多个文件了;
但是,这需要两步来实现完全没有必要,因为我们还有归档并压缩。tar命令可直接调用-z,调用gzip工具,-j调用的是bzip2工具,-J调用的是xz工具。
(4) 归档压缩 -z:gzip2 -zcf /PATH/TO/SOMEFILE.tar.gz FILE... 解压缩并展开归档:-zxf /PATH/TO/SOMEFILE.tar.gz -j:bzip2 -jcf -jxf -J:xz -jcf -jxf zip:既能归档,又能压缩 zip/unzip
示例:现在新建一个目录名为test,在/tmp目录下建立,然后将message等文件复制到该目录中进行归档并压缩。
# mkdir test # cp message* test/ # tar zcf test.tar.gz test/ # ll -h -rw-r--r-- 1 root root 440K Mar 7 20:14 test.tar.gz
之后,我们将test目录给删除,之后解压。在解压时,我们可以直接使用-xf
选项来进行解压并展开归档。
# rm -rf test # tar xf test.tar.gz # ll -h drwxr-xr-x 2 root root 56 Mar 7 20:13 test -rw-r--r-- 1 root root 440K Mar 7 20:14 test.tar.gz
zip其实也是个压缩工具,它也是最通用的压缩工具,无论是在Linux还是Windows上,在Windows中,不用装任何的压缩软件,系统就能够识别该格式的压缩文件,Linux也能支持该压缩文件格式,但是zip的压缩比是很有限的,但是它的特性为:zip既能归档,又能压缩。
五、bash脚本编程之用户交互
我们之前讲述过脚本参数,通过脚本参数,使得让脚本可以灵活且变换不同的内容,让脚本拥有一个更加适用性的做法,其实我们也可以直接让脚本对用户进行交互,而用户交互就是通过键盘让用户输入数据,从而让脚本来对用户输入不同的数据进行不同处理,所以说让脚本更加有适用性通常为两种,第一种就是通过传递参数给脚本,来提供不同的机制,第二种就是用交互式让用户通过键盘输入数据,从而实现灵活的处理机制。
交互的方式命令是由read来实现的,read是一个内建命令,可以变量复制,将用户输入的数据给其保存至变量中,由于这是变量赋值,因此不能家$符号,如果没有足够的数据赋值给变量的话,则最后一个变量则为空数据。所以为填够数据不要回车。但是赋值多了,会将其所有的数据赋值给最后一个变量。
我们还可以使用read给用户进行提示,使用-p
选项对用户进行提示,以及还可以限定时间,使用-t
来指定时间。
练习:我们需要新建一个用户,提示为“input a username”,当这个用户名为空时,则提示"Error! username is need.",并且退出,如果用户名存在,则提示"username exists",不存在否则创建该用户,创建密码时,如果用户没有输出的话,默认密码为"passwd",如果输出密码的话,则将密码给予该用户。
如果在脚本中出现语法错误的话,我们可以使用bash -n
选项,来解决这个问题。但是,最多只能报告语法错误,不能报逻辑错误。
bash -n /path/to/some_script 检测脚本中的语法错误。
还有一种是,明明就有语法错误,但是没办法检测到,在执行过程中总是有错误,可以调试执行,使用bash -x
。
bash -x /path/to/some_script 调试执行
原文地址:http://blog.51cto.com/tianxie/2084126