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

    

  

原文地址:https://www.cnblogs.com/Presley-lpc/p/12250263.html