首页 > 代码库 > 压缩工具及bash脚本编程
压缩工具及bash脚本编程
回顾:
RAID:
不同的服务器配置起来他的借口可能配置起来有所不同,但是官方一般都提供响应的说明书,按照说明书进行配置就行。关键是理解RAID级别的机制的意义是什么
LVM:
其实是一个逻辑设备他存在的主要作用是提供卷管理操作,我们称之为“volume”,
卷管理操作的目的主要是实现把一个或多个底层的物理设备给组织成一个逻辑设备,我们可以将底层的任何类型的块设备,包括我们常见的基本磁盘分区,或者甚至是RAID都OK,只要他们提供块级别的存储空间,但是考虑到任何单个硬件设备他们的边界都是固定的,这是是指基本磁盘分区,就算是RAID能够扩展,但是扩展起来也极为不便,如果说我们现在有一个10G的磁盘分区,随着我们数据的增长,而导致磁盘分区满掉的话,这个时候我们要想让业务继续进行,服务器继续运行,只有一个办法就是找一个更大的分区,比如说找一个30G的或者是50G的,把数据导上去,把服务程序那个对应读取数据的目录指向新的磁盘,这中间势必会导致业务终止,因为不终止,数据就没法复制,也没办法去修改服务自身读取数据的目录,这就是为什么出现了逻辑文件系统,这个逻辑文件系统他的大小可以跨越底层多个设备,但是要借助中间层VG来实现。在一个VG中可以有多个LV,LV存在的作用就是当一个独立的文件系统来使用。有了LV以后我们就不在使用任何的底层设备,而LV的大小是由其内部的PE的大小和PE的数量来决定的。因此LV就是一个逻辑设备。
我们知道LV是在物理设备上又附加的一个逻辑层,所以一旦底层硬件设备发生损坏,那么他上传的数据势必就被损坏了,至少是放在硬件上的设备是损坏的,如果一块硬盘出故障的机率是百分之一的话,那么两块硬盘出的故障率就是百分之二,所以随着底层硬件设备的数量的增加,就会带来了整个设备故障风险的增加,我们一定要记得我们底层设备增加了,那么整机出故障的机率是增加了而不是减小了。在企业中真正的逻辑卷不是直接建立在底层设备上的,而是放在那些有容错能力的RAID上,这就是避免不是因为底层某个磁盘设备的损坏,而导致逻辑卷中的某个分区损坏。
以后LVM与RAID要结合使用。
RAID仅能保证硬件损坏时,业务不会终止,但是不能进行数据备份。我们建议将逻辑卷建立在硬件RAID上。
逻辑卷虽然是逻辑设备但是他也是设备,所以需要内核中的驱动模块开驱动他,
快照卷只是让我们的备份工作更加流畅,更加容易实现而设定的。它本身并不是备份,他只是给备份提供了一个辅助手段,如说直接对线上的体系进行复制的话,将会有一个问题,我们的数据会不一致,一个大文件有20G,我们复制的时候只能将这个数据抽成丝,成为流式数据,一个数据流一个数据流的方式往外复制,而我们的在复制前面数据流时,我们的后面的数据流发行=生变化了,那么我们的数据就不一致了,就会导致系统中有些时间戳不一致,或者说我们在复制开始到复制结束的这之间是不允许系统中的文件的时间戳发生改变的,为了保证这种情况,就出现了快照。
我们知道快照卷刚创建时是空的,但是等打开快照文件是发现我们的文件都在,这是因为我们通过快照卷提供了一个指向原卷的数据的通路。这就表示我们在复制的时候如果我们的文件发生变化,那么我们的快照卷就会将这个文件在发生前那一刻会复制一个副本到快照卷中。
压缩和解压缩工具和bash脚本编程:
我们压缩文件也一般只是压缩文本格式的文件,并且如果文件是压缩文件,那么我们就不能再继续进行压缩操作,除了浪费CPU时钟之外,几乎没什么作用。
压缩比:压缩之前文件的大小与压缩后文件大小的比率
为什么能发生压缩呢?
其实就是分析文件内部数据存储结构的模式实现的。我们只需知道不同的压缩算法,他们对于文本的替换的方式不同所以带来的结果就是他们的压缩比就很可能不一样,有些进行设计的算法,算法很厉害所以压缩比很大,有些算法可能差一点所以压缩比就很小。
压缩的目的:
压缩其实就是拿时间换空间,拿CPU的时间,换的是磁盘的空间
压缩工具:
较早的有:compress/uncompress,压缩后文件的后缀是:.Z
现在最流行的:gzip/gunzip,压缩后文件的后缀是:.gz
新近又出现了bzip2/bunzip2,压缩后文件的后缀是:.bz2
之后又出现了:
xz/unxz压缩后文件的后缀是:.xz
(xz是最近刚出现的,也是越来越受欢迎的,动摇了gzip的压缩统治地位)
lzma/unlzma压缩后文件的后缀是:.lzma
归档的工具:
zip/unzip这是既能归档也能压缩的。
tar,cpio这是纯粹的归档
1.gzip/gunzip/zcat
功能: gzip,gunzip, zcat - compress or expand files 压缩或还原文件
说明:使用gzip压缩文件时,会将原文件删除,解压压缩文件后,压缩的文件也会被删除。虽然说在linux上是不区分文件后缀名的,但是在gzip上是区分后缀名的。
演示:
[root@centos6 tmp]# ll -lh messages
-rw-------. 1 root root 473K Nov 15 12:51 messages
[root@centos6 tmp]# gzip messages
[root@centos6 tmp]# ll -lh messages.gz
-rw-------. 1 root root 61K Nov 15 12:51 messages.gz
[root@centos6 tmp]#
使用gzip压缩后的文件我们可以使用命令“zcat”来查看压缩文件中的内容。如果用cat查看压缩文件的话就会显示乱码。
注意:当一个压缩问价非常大的话,建议不要使用zcat来查看,比方说一个几个G的文件,我们使用zcat来展开文件,那么就可能几分钟就过去了。所以zcat只适用于查看小文件。
gzip的使用格式:
gzip [OPTION]... FILE....
选项:
-d:解压缩,相当于gunzip;
-#:指定压缩比,默认是6,数字越大压缩比越大;#范围是1-9
-c:将压缩结果输出至标准输出;
一般是这样使用: gzip -c FILE > /PATH/TO/SOMEFILE.gz
(当使用选项“-c”不将结果保存至指定文件时,屏幕会输出压缩后的乱码,那么我们需要执行命令“reset”来重置终端。)
在说第二个工具之前,打开一个网站叫“www.kernel.org”这就是linux内核站点我们可以看一下网站上很多文件都是压缩文件,我们可以对那些“.gz”和“.xz”还有“.bz2”格式的压缩文件的同样压缩比。这里还提到了登录FTP服务器,我们在命令行中输入:
(1)首先yum安装lftp命令
(2)想将文件下载至哪个目录,就先切换到哪个目录然后再访问FTP
(3)在命令行上输入:lftp 10.1.0.1
(4)使用mget命令下载。
(5)退出FTP服务器,使用bye命令或者exit
将来我们从网站下载源码包时,一般都是提供给我们压缩包,这是因为第一是节约空间。第二是下载时节约带宽。
2. bzip2/bunzip2/bzcat
bzip2 [OPTION].... FILE.....
举例:
[root@centos6 tmp]# ll -lh messages
-rw-------. 1 root root 473K Nov 15 12:51 messages
[root@centos6 tmp]# bzip2 messages
[root@centos6 tmp]# ll -lh messages.bz2
-rw-------. 1 root root 32K Nov 15 12:51messages.bz2
[root@centos6 tmp]# bunzip2 messages.bz2
[root@centos6 tmp]# ll -lh messages
-rw-------. 1 root root 473K Nov 15 12:51 messages
[root@centos6 tmp]#
选项:
-d:解压缩,相当于bunzip2;
-#:指定压缩比;默认是6.;数字越大压缩比越大(1-9);
-k:keep,保留原文件;(对于他的使用无需使用输出重定向,直接使用“bzip2 -k messages”他会在压缩时自动保留源文件而不再删除。)
bzcat:不用解压缩文件,也能查看压缩文件的内容。
3. xz/unxz/xzcat
lzma/unlzma/lzmacat
格式:
xz [OPTION].... FILE....
选项:
-d:解压缩;
-#:指定压缩比;默认是6,数字越大压缩比就越大(1-9);
-k:保留源文件;
xzcat:不用解压缩文件就能查看压缩文件内容
注意:上面的三款工具只支持压缩文件不支持压缩目录
演示:
[root@centos6 testdir]# cp /var/log/*.log /testdir/test/
[root@centos6 testdir]# ll -lh test/
total 964K
-rw-------. 1 root root 2.4K Nov 15 13:53anaconda.ifcfg.log
-rw-------. 1 root root 23K Nov 15 13:53 anaconda.log
-rw-------. 1 root root 41K Nov 15 13:53 anaconda.program.log
-rw-------. 1 root root 171K Nov 15 13:53anaconda.storage.log
-rw-------. 1 root root 141K Nov 15 13:53anaconda.yum.log
-rw-r--r--. 1 root root 3.3K Nov 15 13:53boot.log
-rw-r--r--. 1 root root 412K Nov 15 13:53dracut.log
-rw-r-----. 1 root root 0 Nov 15 13:53 mysqld.log
-rw-r--r--. 1 root root 89 Nov 15 13:53 pm-powersave.log
-rw-------. 1 root root 0 Nov 15 13:53 spice-vdagent.log
-rw-r--r--. 1 root root 5.4K Nov 15 13:53vmware-install.log
-rw-r--r--. 1 root root 30K Nov 15 13:53 vmware-vmsvc.log
-rw-r--r--. 1 root root 34K Nov 15 13:53 vmware-vmusr.log
-rw-r--r--. 1 root root 0 Nov 15 13:53 wpa_supplicant.log
-rw-r--r--. 1 root root 49K Nov 15 13:53 Xorg.0.log
-rw-r--r--. 1 root root 22K Nov 15 13:53 Xorg.9.log
-rw-------. 1 root root 51 Nov 15 13:53 yum.log
[root@centos6 testdir]# ll -ldh test/
drwxr-xr-x. 2 root root 4.0K Nov 15 13:53test/
[root@centos6 testdir]# gzip test/
gzip: test/ is a directory -- ignored
[root@centos6 testdir]#
所以说明这些工具不支持对目录进行压缩,但是我们在windows中我们使用的压缩工具好像也支持对目录的压缩,那为什么二者会不同呢?
解:
上面的几款工具的确不支持压缩目录的功能,如果我们想要对目录进行压缩,而不是仅压缩目录中的一个文件,那么我们需要对目录中的这些文件进行归档操作。
归档操作:
相当于把多个文件打包成一个文件,这种操作就叫归档操作。归档完成后我们看到的是一个文件,而不是单个文件,但是打包的一个缺点就是,打包之后这个归档文件反而会更大,这是因为这个打包工具本身也有大小,所以一般而言用打包工具进行归档后,我们都用压缩工具对其进行压缩。所以一般归档和压缩是结合起来使用。
归档:
工具:tar,cpio
tar命令:
格式: tar [OPTION].... FILE.....
说明:tar的选项可以不加减号“-”,并且tar归档文件时不像上面的压缩工具我们不用指明压缩后的文件名,这里归档需要自己手动指定归档的文件名,所以需要使用-f选项,所以下面的三种操作一般是结合选项“-f”使用的,并且选项“-f”需要参数,也就是文件名,打包后的文件名后缀一定是“.tar”结尾。
(1)创建归档:
-c -f /PATH/TO/SOMEFILE.tar FILE.......
-cf /PATH/TO/SOMEFILE.tar FILE.......
(2)展开归档:
-x -f /PATH/TO/SOMEFILE.tar
-x -f /PATH/TO/SOMEFILE.tar -C(大写)目标目录
(3)查看归档文件中文件列表:
-t -f /PATH/TO/SOMEFILE.tar
注意:归档的时候,选项-c与-f可以合并写“-cf”但是不能写反了写成“-fc”,以为写反了,后面的文件,系统就以为是选项“-c”的参数了。并且注意归档是不删除原文件爱你的,将归档文件解归档到指定的目录下,需要使用大写的选项“-C”后面跟上执行的目标目录路径。
演示:
[root@centos6 testdir]# ll test/
total 1928
-rw-------. 1 root root 962560 Nov 15 14:22anaconda.ifcfg.log
-rw-------. 1 root root 22956 Nov 15 13:53 anaconda.log
-rw-------. 1 root root 41980 Nov 15 13:53 anaconda.program.log
-rw-------. 1 root root 174135 Nov 15 13:53anaconda.storage.log
-rw-------. 1 root root 144227 Nov 15 13:53anaconda.yum.log
-rw-r--r--. 1 root root 3345 Nov 15 13:53 boot.log
-rw-r--r--. 1 root root 421683 Nov 15 13:53dracut.log
-rw-r--r--. 1 root root 25419 Nov 15 13:53 functions
-rw-r-----. 1 root root 0 Nov 15 13:53 mysqld.log
-rw-r--r--. 1 root root 89 Nov 15 13:53 pm-powersave.log
-rw-------. 1 root root 0 Nov 15 13:53 spice-vdagent.log
-rw-r--r--. 1 root root 5448 Nov 15 13:53 vmware-install.log
-rw-r--r--. 1 root root 30494 Nov 15 13:53 vmware-vmsvc.log
-rw-r--r--. 1 root root 34261 Nov 15 13:53 vmware-vmusr.log
-rw-r--r--. 1 root root 0 Nov 15 13:53 wpa_supplicant.log
-rw-r--r--. 1 root root 49420 Nov 15 13:53 Xorg.0.log
-rw-r--r--. 1 root root 22217 Nov 15 13:53 Xorg.9.log
-rw-------. 1 root root 51 Nov 15 13:53 yum.log
[root@centos6 testdir]# tar -cf mylog.tar test/*.log //这是归档文件
[root@centos6 testdir]# ls
backup lost+found mylog.tar scripts test
[root@centos6 testdir]#
[root@centos6 testdir]# mkdir -p /testdir/tar
[root@centos6 testdir]# tar -xf mylog.tar -C tar/ //解归档至指定的目录下
[root@centos6 testdir]# ll tar/
total 4
drwxr-xr-x. 2 root root 4096 Nov 15 14:32 test
[root@centos6 testdir]# tar -tf mylog.tar //查看归档文件的列表。
test/anaconda.ifcfg.log
test/anaconda.log
test/anaconda.program.log
test/anaconda.storage.log
test/anaconda.yum.log
test/boot.log
test/dracut.log
test/mysqld.log
test/pm-powersave.log
test/spice-vdagent.log
test/vmware-install.log
test/vmware-vmsvc.log
test/vmware-vmusr.log
test/wpa_supplicant.log
test/Xorg.0.log
test/Xorg.9.log
test/yum.log
[root@centos6 testdir]#
总结:tar命令中任何选项都带“-f”选项。
归档完成后通常需要压缩,结合此前的压缩工具,就能实现压缩多个文件了;
(4)归档并压缩
-z:直接调用gzip2
归档并压缩文件: -zcf /PATH/TO/SOMEFILE.tar.gz FILE.....
解压缩并展开归档: -zxf /PATH/TO/SOMEFILE.tar.gz
-j:直接调用bzip2
归档并压缩文件: -jcf
解压缩并展开归档: -jxf /PATH/TO/SOMEFILE.tar.gz
-J(大写):直接调用xz
归档并压缩文件: -Jcf
解压缩并展开归档: -Jxf /PATH/TO/SOMEFILE.tar.gz
zip工具:
既能归档又能压缩。
后缀名:.zip
在使用是,压缩后的文件名需要手动指定,并且文件后缀是“.zip”展开文件使用
unzip命令。
练习:
下载redis-3.0.2.tar.gz
网站下载:www.redis.io或教室FTP服务器
要求:展开至/tmp目录;而后再创建压缩为xz格式。
解:
[root@centos6 testdir]# lftp 10.1.0.1
lftp 10.1.0.1:~> cd /pub/Sources/sources/redis
cd ok, cwd=/pub/Sources/sources/redis
lftp 10.1.0.1:/pub/Sources/sources> cd redis/
lftp10.1.0.1:/pub/Sources/sources/redis> ls
-rwxr--r-- 1 500 500 1064262 Apr 30 2014 redis-2.8.7.tar.gz
-rwxr--r-- 1 500 500 1097369 May 13 2014 redis-2.8.9.tar.gz
-rwxr--r-- 1 500 500 1360182 Jun 26 2015 redis-3.0.2.tar.gz
lftp10.1.0.1:/pub/Sources/sources/redis> mget redis-3.0.2.tar.gz
1360182 bytes transferred
lftp10.1.0.1:/pub/Sources/sources/redis> bye
[root@centos6 testdir]# ls
backup lost+found mylog.tar redis-3.0.2.tar.gz scripts tar test
[root@centos6 testdir]# tar -zxf redis-3.0.2.tar.gz
[root@centos6 testdir]# ls
backup lost+found mylog.tar redis-3.0.2 redis-3.0.2.tar.gz scripts tar test
[root@centos6 testdir]# cd redis-3.0.2
[root@centos6 redis-3.0.2]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests
BUGS deps MANIFESTO runtest sentinel.conf utils
CONTRIBUTING INSTALL README runtest-cluster src
[root@centos6 redis-3.0.2]# cd ..
[root@centos6 testdir]# ls
backup lost+found mylog.tar redis-3.0.2 redis-3.0.2.tar.gz scripts tar test
[root@centos6 testdir]# tar -Jcf redis-3.0.2.tar.xzredis-3.0.2
[root@centos6 testdir]# ls
backup mylog.tar redis-3.0.2.tar.gz scripts test
lost+found redis-3.0.2 redis-3.0.2.tar.xz tar
[root@centos6 testdir]#
注意:tar打包压缩的时候我们一定要进行指明压缩包的名称和要打包压缩的文件。
bash脚本编程之用户交互:
(此前我们讲的脚本参数,我们通过向脚本中传递参数,使得脚本能够灵活的变换的处理不同的内容,这是一种能够让我们的脚本拥有更好的适应性,这就叫脚本参数其实我们也可以直接让脚本跟用户进行交互,用户通过键盘输入数据,从而实现灵活的处理机制linux中的一个重要的哲学思想就是尽量避免与用户交互,避免交互的目的就是为了脚本从头启动以后从头运行至尾部完成所有操作的。所以将来我们在真正做的时候,尽量避免交互式操作,除非我们每次打算交互式操作。但是我们需要了解交互这个方式是怎样实现的。)
实现交互的命令是:read
[root@centos6 ~]# type read
read is a shell builtin //read是一个内建命令
[root@centos6 ~]#
脚本参数
read其实也可以赋值给数组的。
用户交互:通过键盘输入数据,从而完成变量赋值操作;
格式:
read [option]... [name....] //这个name是变量名,这个表达式是变量赋值不是引用
功能:read的作用其实就是将输入的内容分别赋值给不同的变量
选项:
-p ‘PROMPT‘ //给定一个提示符
-t TIMEOUT //超时
演示:
[root@centos6 ~]# read name //其实这就是read赋值,将用户输入的值复制给read 后面的变量中
dong
[root@centos6 ~]# echo $name
dong
[root@centos6 ~]#
[root@centos6 ~]# read a b //read后面跟两个变量
hua xiang //输入两个变量值
[root@centos6 ~]# echo $a //这说明read能够将用户数据的数据自动分隔,并赋值给变量
hua
[root@centos6 ~]# echo $b
xiang
[root@centos6 ~]#
如果输入的数据不对等,那么结果就有点麻烦
第一种情况:
[root@centos6 ~]# read a b c
zhong guo
[root@centos6 ~]# echo $a
zhong
[root@centos6 ~]# echo $b
guo
[root@centos6 ~]# echo $c
第二种情况:
[root@centos6 ~]# read a b c
ni hao ma xiang
[root@centos6 ~]# echo $a
ni
[root@centos6 ~]# echo $b
hao
[root@centos6 ~]# echo $c //显示将用户后面的两个数据全部赋值给了最后一个变量
ma xiang
[root@centos6 ~]#
另外我们如果希望用户按照我们的意思去输入数据,那么我应该给用户一个提示信息。
就像:下面这个命令,我们仅是输入“read name”然后回车就出现这种情况,那么用户也不知道也下来要做什么,所以我们要是在前面加上一些提示符那么用户就知道了
给用户一段提示信息:
方法一:
可以使用echo命令与read的结合:
[root@centos6 ~]# echo "please enter a name: ";read name //两个命令中间要加分号连接
please enter a name:
tian
[root@centos6 ~]# echo $name
tian
[root@centos6 ~]# echo -n "please enter a name: ";read name //在一行显示
please enter a name: xiang
[root@centos6 ~]# echo $name
xiang
[root@centos6 ~]#
方法二:
可以单独使用read命令,加上其“-p”选项即可
[root@centos6 ~]# read -p "please enter a name:" name
please enter a name:nie
[root@centos6 ~]# echo $name
nie
[root@centos6 ~]#
注意read选项“-t”表示设置时间,表示用户多长时间内不输入内容这个命令就失效了
[root@centos6 ~]# read -t 5 -p "please enter a name:" name
please enter a name:[root@centos6 ~]#
please enter a name:[root@centos6 ~]# echo $name
[root@centos6 ~]#
[root@centos6 ~]# [ -z "$name"]&&name="obama" //这个命令可以解决当变量为空时, 我们自动给变量赋值一个默认值
[root@centos6 ~]# echo $name
obama
[root@centos6 ~]#
注意:
[-z "$name" ]&&name="obama"其实这个命令以后我们在写脚本的时候,我们可以使用这个命令给脚本中的变量再没有值的情况下赋值一个默认的值,以避免因为脚本中变量没有值而导致的脚本执行错误。
利用上面的命令写一个脚本,这个脚本能够执行的功能是,能够添加一个用户,但是需要提示用户需要用户通过键盘数据用户的名是什么,并且能够在用户添加成功后。将用户的密码设置对应项,
#!/bin/bash
#
read-p "please enter a name:" name
[-z "$name" ] && echo "a username is needed."&& exit 2
read-p "please enter password for $name, [password]:" password
[-z "$password" ] && password="password"
ifid $name &> /dev/null; then
echo "$name exists."
else
useradd $name
echo "password" | passwd--stdin $name &> /dev/null
echo "Add user $namefinished."
fi
bash -n /path/to/some_script
检测脚本中的语法错误
当我们写的脚本价差语法错误时,没有检查出来,但是运行脚本就是运行不成功,那么我们就可以使用调试运行这个命令,一步步的执行脚本中的命令。
bash -x /path/to/some_script
调试运行
演示:
[root@centos6 scripts]# bash -x adduser.sh
+ read -p ‘please enter a name:‘ name
please enter a name:wang
+ ‘[‘ -z wang ‘]‘
+ read -p ‘please enter password for wang,[password]:‘ password
please enter password for wang, [password]:123456
+ ‘[‘ -z 123456 ‘]‘
+ id wang
+ useradd wang
+ echo password
+ passwd --stdin wang
+ echo ‘Add user wang finished.‘
Add user wang finished.
[root@centos6 scripts]#
写一个脚本:
列出所有的已知磁盘设备文件,然后查看磁盘设备上有多少个分区信息
示例:
#!/bin/bash
#Version:0.0.1
#Author:MageEdu
#Description:read testing
read -p "Enter a disk special file:" diskfile
[ -z "$diskfile" ] && echo "Fool" && exit 1
if disk -l | grep "^Disk $diskfile" &> /dev/null;then
fdisk -l $diskfile
else
echo "Wrong disk special file."
exit 2
fi
本文出自 “11847750” 博客,请务必保留此出处http://11857750.blog.51cto.com/11847750/1875128
压缩工具及bash脚本编程