linux学习35 压缩工具及shell脚本编程实战应用
一、回顾
1、RAID:level
2、LVM:volume
3、btrfs:了解
二、压缩和解压缩工具和bash脚本编程
1、压缩比:文件压缩前与压缩后大小的比例
2、常见的压缩和解压缩工具
3、压缩的目的: 拿时间换空间
CPU的时间 ---> 磁盘空间
4、常见的压缩工具和解压缩工具
a、早期压缩和解压工具:compress/uncompress:压缩后格式为 文件名.Z
b、gzip/gunzip::早期压缩工具一直为gzip最火,压缩后格式为:文件名.gz
c、bzip2/bunzip2:压缩效率相比于gzip其实并没有太大的提升,甚至在压缩小文件时还不如gzip,因此其并没有撼动gzip的地位。压缩后格式为: 文件名.bz2
d、xz/unxz :这个工具是真正撼动了gzip的地位,并且压缩效率比gzip高的多。其压缩后格式为:文件名.xz
lzma, unlzma, lzcat,压缩后的后缀名为 .lzma
e、zip/unzip:进行归档的工具
f、tar,cpio:纯粹的归档工具
三、相应压缩工具的使用
1、gzip/gunzip/zcat
a、gzip ,压缩后会删除原文件,并且压缩后的文件名称为 原文件名.gz,并且gzip压缩后必须以.gz结尾
gzip [OPTION]... FILE...
-d:解压缩,相当于gunzip;
[root@node1 tmp]# ls -lh messages -rw------- 1 root root 296K Feb 2 00:13 messages [root@node1 tmp]# gzip messages [root@node1 tmp]# ls -lh messages.gz -rw------- 1 root root 42K Feb 2 00:13 messages.gz [root@node1 tmp]# gzip -d messages.gz [root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages
-#:指定压缩比,默认是6;数字越大压缩比越大,一般选择默认的就好
-c:将压缩结果输出至标准输出,通常使用如下方式
gzip -c <FILE> /PATH/TO/SOMEFILE.gz
[root@node1 tmp]# ll |grep message -rw------- 1 root root 302162 Feb 2 00:13 messages [root@node1 tmp]# gzip -c messages > messages.gz [root@node1 tmp]# ll |grep message -rw------- 1 root root 302162 Feb 2 00:13 messages -rw-r--r-- 1 root root 42943 Feb 2 00:37 messages.gz
[root@node1 tmp]# gzip messages [root@node1 tmp]# ls -lh |grep message -rw------- 1 root root 42K Feb 2 00:13 messages.gz
b、gunzip,解压缩后会删除压缩文件只剩下解压后的文件
[root@node1 tmp]# gunzip messages.gz [root@node1 tmp]# ls -lh |grep message -rw------- 1 root root 296K Feb 2 00:13 messages
c、zcat,查看压缩后的文件,如果直接用cat查看压缩后的文件直接会乱码
[root@node1 tmp]# zcat messages.gz
2、 bzip2/bunzip2/bzcat
a、bzip2,压缩后也会删除原文件
[root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages [root@node1 tmp]# bzip2 messages [root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 27K Feb 2 00:13 messages.bz2
bzip2 [OPTION]... FILE...
-d:解压缩
[root@node1 tmp]# bzip2 -d messages.bz2 [root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages
-#:指定压缩比,范围为1-9,默认为6,数字越大,压缩比越大
-k:keep,保留原文件
[root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages [root@node1 tmp]# bzip2 -k messages [root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages -rw------- 1 root root 27K Feb 2 00:13 messages.bz2
b、bzcat,查看压缩后的文件
3、xz/unxz/xzcat
lzma, unlzma, lzcat
a、xz :压缩后也会删除原文件
xz [OPTION]... FILE...
-d:解压缩
[root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages [root@node1 tmp]# xz messages [root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 22K Feb 2 00:13 messages.xz [root@node1 tmp]# xz -d messages.xz [root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages
-#:指定压缩比,默认为6,数字越大压缩比越大
-k:保留原文件
[root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages [root@node1 tmp]# xz -k messages [root@node1 tmp]# ls -lh |grep mess -rw------- 1 root root 296K Feb 2 00:13 messages -rw------- 1 root root 22K Feb 2 00:13 messages.xz
b、xzcat,查看压缩后的文件
4、上述三款工具只支持压缩文件不支持压缩目录。如果我们要对目录压缩我们要对其进行归档操作。归档也就是将多个文件合并成一个文件。归档后其不但不会减小文件大小反而会增加文件大小,因此归档后还需要对归档文件进行压缩操作。
a、归档一般对linux来说有两个,tar和cpio,不过cpio用的比较少。
5、tar:归档,不会删除原文件
tar [OPTION]... FILE...
a、创建归档,需要同时使用-f选项指明是哪个文件
-c -f /PATH/TO/SOMEFILE.tar FILE...
[root@node1 tmp]# ls /tmp/test/ boot.log functions messages vmware-vmsvc.log yum.log [root@node1 tmp]#cd test && tar -cf /tmp/mylog.tar *.log
[root@node1 test]# du -sh /tmp/mylog.tar
332K /tmp/mylog.tar
b、展开归档,需要同时使用-f 选项指明是哪个文件
-x -f /PATH/FROM/SOMEFILE.tar
[root@node1 tmp]# ls fstab mbr.bak mylog.tar systemd-private-037a2534ce0f4100a971c6afaaab76f5-vmtoolsd.service-jnxVZd tmp fstab.2 messages systemd-private-037a2534ce0f4100a971c6afaaab76f5-vgauthd.service-12T5DU test [root@node1 tmp]# tar -xf mylog.tar [root@node1 tmp]# ls boot.log fstab.2 messages systemd-private-037a2534ce0f4100a971c6afaaab76f5-vgauthd.service-12T5DU test vmware-vmsvc.log fstab mbr.bak mylog.tar systemd-private-037a2534ce0f4100a971c6afaaab76f5-vmtoolsd.service-jnxVZd tmp yum.log
-C,展开至指定路径
-xf /PATH/FROM/SOMEFILE.tar -C /PAtH/TO/SOMEDIR
[root@node1 tmp]# mkdir newtest [root@node1 tmp]# tar -xf mylog.tar -C newtest/ [root@node1 tmp]# ls newtest/ boot.log vmware-vmsvc.log yum.log
c、查看归档文件中的文件列表,需要同时使用-f选项指明是哪个文件
-tf /PATH/TO/SOMEFILE.tar
[root@node1 tmp]# tar -tf mylog.tar boot.log vmware-vmsvc.log yum.log
6、tar和压缩命令结合,归档完以后通常需要压缩,结合此前的压缩工具,就能实现压缩多个文件了;
a、归档并压缩
1)、-z:gzip
-zcf /PATH/TO/SOMEFILE.tar.gz FILE... :创建归档并压缩
-zxf /PATH/TO/SOMEFILE.tar.gz :解压缩并展开归档,(也可以省略 -z选项,因为tar工具会自动识别)
[root@node1 tmp]# tar -zcf /tmp/mylog2.tar.gz test [root@node1 tmp]# rm -rf test/ [root@node1 tmp]# ls fstab mbr.bak mylog2.tar.gz systemd-private-037a2534ce0f4100a971c6afaaab76f5-vgauthd.service-12T5DU tmp fstab.2 messages newtest systemd-private-037a2534ce0f4100a971c6afaaab76f5-vmtoolsd.service-jnxVZd [root@node1 tmp]# tar -zxf mylog2.tar.gz [root@node1 tmp]# ls test/ boot.log functions messages vmware-vmsvc.log yum.log
2)、-j:bzip2
-jcf /PATH/TO/SOMEFILE.tar.bz2 FILE... :创建归档并压缩
-jxf /PATH/TO/SOMEFILE.tar.bz2 :解压缩并展开归档,(也可以省略 -j选项,因为tar工具会自动识别)
3)、大写的j,即J:xz
-Jcf /PATH/TO/SOMEFILE.tar.xz FILE... :创建归档并压缩
-Jxf /PATH/TO/SOMEFILE.tar.xz:解压缩并展开归档,(也可以省略 -J选项,因为tar工具会自动识别)
7、zip/unzip:目前为止最为通用的一个压缩工具,linux,windows,mac都通用,不过其压缩比是有限的,其自身既能归档又能压缩。
a、zip。创建后的文件名为 文件名.zip
zip -r 压缩后文件名.zip 压缩文件或文件夹 (-r为递归压缩)
b、unzip:解压
四、练习
1、下载redis-3.0.2.tar.gz,展开至/tmp目录;而后再重新创建压缩为xz格式
五、shell编程
1、read:用户交互:即通过键盘输入数据,从而完成变量赋值操作。
a、他能将输入的变量自动分割
[root@node1 tmp]# read a b 1 2 [root@node1 tmp]# echo $a 1 [root@node1 tmp]# echo $b 2
b、若输入的数据多余变量参数个数那么会将后面的所有值赋值给最后一个变量
[root@node1 tmp]# read a b c 1 2 3 4 5 6 [root@node1 tmp]# echo $a 1 [root@node1 tmp]# echo $b 2 [root@node1 tmp]# echo $c 3 4 5 6
c、read -p,给一个提示符
[root@node1 /]# read -p "input your name:" name input your name:wohaoshuai [root@node1 /]# echo $name wohaoshuai
d、-t ,超时时间,比如我们设置超时时间为5秒,即5秒过后未输入就超时了
[root@node1 /]# read -t 5 -p "input your name:" name input your name:[root@node1 /]#
e、编程实践
[root@node1 script]# cat adduser2.sh #!/bin/bash read -p "Enter a username: " name [ -z "${name}" ] && echo "a username is needed." && exit 2 read -p "Enter password for $name,[password] " password [ -z "$password" ] && password="password" if id $name &> /dev/null; then echo "$name exists." else useradd $name echo "$password " |passwd --stdin $name &> /dev/null echo "Add user $name Finished" fi [root@node1 script]# bash adduser2.sh Enter a username: zhangsan Enter password for zhangsan,[password] Add user zhangsan Finished
2、检查脚本是否有语法错误:bash -n
[root@node1 script]# bash -n adduser2.sh
3、调试模式:bash -x
[root@node1 script]# bash -x adduser2.sh + read -p 'Enter a username: ' name Enter a username: zhangsan + '[' -z zhangsan ']' + read -p 'Enter password for zhangsan,[password] ' password