压缩/解压缩及归档工具的使用

part1.常见的工具

compress/uncompress    .Z

gzip/gunzip            .gz

bzip2/bunzip2          .bz2

zip/unzip

tar ,cpio

gzip命令用来压缩文件。gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处“.gz”扩展名。

gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。gzip不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式。据统计,gzip命令对文本文件有60%~70%的压缩率。减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。

选项

-a或——ascii:使用ASCII文字模式;

-d或--decompress或----uncompress:解开压缩文件;

-f或——force:强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接;

-h或——help:在线帮助;

-l或——list:列出压缩文件的相关信息;

-L或——license:显示版本与版权信息;

-n或--no-name:压缩文件时,不保存原来的文件名称及时间戳记;

-N或——name:压缩文件时,保存原来的文件名称及时间戳记;

-q或——quiet:不显示警告信息;

-r或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;

-S或<压缩字尾字符串>或----suffix<压缩字尾字符串>:更改压缩字尾字符串;

-t或——test:测试压缩文件是否正确无误;

-v或——verbose:显示指令执行过程;

-V或——version:显示版本信息;

-<压缩效率>:压缩效率是一个介于1~9的数值,预设值为“6”,指定愈大的数值,压缩效率就会愈高;

--best:此参数的效果和指定“-9”参数相同;

--fast:此参数的效果和指定“-1”参数相同。

zcat 不显示展开的前提下查看文本文件内容:

实例:

拷贝 /var/log/messages到mydata目录并查看大小为189K,对文件压缩后查看【提示:gzip压缩文件时会删除源文件】

[root@ad1 ~]# cp /var/log/messages /mydata
[root@ad1 ~]# cd /mydata
[root@ad1 mydata]# ll -h
total 196K
drwxr-xr-x. 1 root root    0 Feb 27 20:21 cache
-rw-r--r--. 1 root root  617 Feb 27 07:43 fstab
-rw-------. 1 root root 189K Feb 27 22:33 messages


[root@ad1 mydata]# gzip messages 
[root@ad1 mydata]# ll -h
total 32K
drwxr-xr-x. 1 root root   0 Feb 27 20:21 cache
-rw-r--r--. 1 root root 617 Feb 27 07:43 fstab
-rw-------. 1 root root 27K Feb 27 22:33 messages.gz


解压缩文件和gzip -d参数相当

[root@ad1 mydata]# gunzip messages.gz 
[root@ad1 mydata]# gzip -d  messages.gz


压缩文件并保留源文件

[root@ad1 mydata]# gzip -c messages >messages.gz
[root@ad1 mydata]# ls
cache  fstab  messages  messages.gz


采用比较高的压缩比来压缩文件并保留源文件

[root@ad1 mydata]# gzip -8 -c messages > messages.2.gz


直接查看压缩文件内容

[root@ad1 mydata]# zcat messages.gz | less


bzip2命令用于创建和管理(包括解压缩)“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种,以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看,相信大家看完后会有很多收获。

选项

-c或——stdout:将压缩与解压缩的结果送到标准输出;

-d或——decompress:执行解压缩;

-f或-force:bzip2在压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件。若要覆盖。请使用此参数;

-h或——help:在线帮助;

-k或——keep:bzip2在压缩或解压缩后,会删除原始文件。若要保留原始文件,请使用此参数;

-s或——small:降低程序执行时内存的使用量;

-t或——test:测试.bz2压缩文件的完整性;

-v或——verbose:压缩或解压缩文件时,显示详细的信息;

-z或——compress:强制执行压缩;

-V或——version:显示版本信息;

--repetitive-best:若文件中有重复出现的资料时,可利用此参数提高压缩效果;

--repetitive-fast:若文件中有重复出现的资料时,可利用此参数加快执行效果。

实例:

压缩文件,会删除源文件生成的文件格式以  .bz2结尾

[root@ad1 mydata]# bzip2 messages


解压缩文件

[root@ad1 mydata]# bzip2 -d messages.bz2 
[root@ad1 mydata]# ll -h


压缩的同时保留源文件

[root@ad1 mydata]# bzip2 -k messages
[root@ad1 mydata]# ll -h


bzcat: 不显式展开的前提下查看文本文件内容:

tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。

首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。

选项

-A或--catenate:新增文件到以存在的备份文件; 

-B:设置区块大小; 

-c或--create:建立新的备份文件;

-C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

-d:记录文件的差别;

-x或--extract或--get:从备份文件中还原文件;

-t或--list:列出备份文件的内容;

-z或--gzip或--ungzip:通过gzip指令处理备份文件;

-Z或--compress或--uncompress:通过compress指令处理备份文件; 

-f<备份文件>或--file=<备份文件>:指定备份文件; 

-v或--verbose:显示指令执行过程; 

-r:添加文件到已经压缩的文件; 

-u:添加改变了和现有的文件到已经存在的压缩文件;

-j:支持bzip2解压文件;-v:显示操作过程; 

-l:文件系统边界设置; 

-k:保留原有文件不覆盖; 

-m:保留文件不被覆盖; 

-w:确认压缩文件的正确性; 

-p或--same-permissions:用原来的文件权限还原文件; 

-P或--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号; 

-N <日期格式> 或 

--newer=<日期时间>:只将较指定日期更新的文件保存到备份文件里; 

--exclude=<范本样式>:排除符合范本样式的文件。

将文件全部打包成tar包

[root@ad1 mydata]# tar -cvf message.tar  messages                          仅打包,不压缩! 
 [root@ad1 mydata]# tar -zcvf messages.tar.gz messages                      打包后,以 gzip 压缩 
[root@ad1 mydata]# tar -jcvf messages.tar.bz2 messages                      打包后,以 bzip2 压缩

                                     

在选项f之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加z选项,则以.tar.gz或.tgz来代表gzip压缩过的tar包;如果加j选项,则以.tar.bz2来作为tar包名。

[root@ad1 etc]# cp -r /etc/grub.d   /mydata   
[root@ad1 etc]# cd /mydata
[root@ad1 mydata]# tar -cf grub.d.tar grub.d       仅打包目录,不压缩!


将打包的文档解开放到指定目录

[root@ad1 mydata]# tar xf grub.d.tar -C /tmp/test
[root@ad1 mydata]# ll -h /tmp/test


解压

tar -xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2   //解压 tar.bz2
tar -xZvf file.tar.Z   //解压tar.Z

part2.for循环语句

for  循环

      for  变量名   in   列表  ; do

             循环体

       done

解释

执行流程:依次将列表中的元素赋值给“变量名”;每次赋值后即执行依次循环体,直到列表中的元素耗尽

实例1:

添加10个用户,jd001-jd010,密码同用户名

$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)

if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elif和else

[root@ad1 mydata]# cat adduser.sh 
#!/bin/bash
if [ ! $UID -eq 0 ] ; then
   echo "you can add user  successfully."
   exit 1
fi
for  i   in {1..10};do
     if id user$i &> /dev/null;then
        echo "user$i exists."
     else
         useradd user$i
         if [ $? -eq 0 ]; then
             echo "user$i" | passwd --stdin $username &> /dev/null
             echo "Add user$i  finished."
          fi
      fi
done


查看脚本的执行过程

[root@ad1 mydata]# bash -x adduser.sh

for循环的列表生成方式

1,直接给出;2,整数列表   {1..10}      seq 3 2 100       从3开始,步进为2,到一百以内的奇数

seq 2 2 100  3,$[COMMAND];4,文件名通配机制  glob

实例2:

对var目录下文件类型做判断 ;-f /var/$file 没搞明白

演示$[COMMAND]的用法

[root@ad1 mydata]# cat  filetype.sh 
#!/bin/bash
#author SXL
#date 2018-03-1
#purpose for testing /var/*   filetype.
for file in $(ls /var);do
    if [ -f /var/$file ];then
       echo "$file common files."
    elif [ -L /var/$file ];then
         echo "$file symbolic file."
    elif [ -d /var/$file ];then
         echo "$file is a  DIrectory."
    else
         echo "$file Other type."
    fi
done


实例3:

找到netstat命令执行后,包含LISTEN字符串的

演示$[COMMAND]的用法

[root@ad1 ~]# netstat -tan | grep "^tcp" | awk '{print $NF}'
[root@ad1 mydata]# cat  tcpstat.sh
#!/bin/bash
#author SXL
#date 2018-03-1
#purpose for A character occurrences of statistics .
declare -i estab=0
declare -i listen=0
declare -i other=0
for state in $(netstat -tan | grep "^tcp" | awk '{print $NF}');do
    if [ "$state" == 'ESTABLISHED' ];then
        let estab++
    elif [ "$state" == 'LISTEN' ];then
        let listen++
    else 
        let other++
    fi
done
echo "ESTABLISHED: $estab"
echo "LISTEN:$listen"
echo "Unknown: $other"