2018-3-6Linux系统管理压缩与解压缩工具bash交互

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-3-6Linux系统管理压缩与解压缩工具bash交互相关的知识,希望对你有一定的参考价值。

  回顾上一章所学到的内容有如何制作软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
	   调试执行


以上是关于2018-3-6Linux系统管理压缩与解压缩工具bash交互的主要内容,如果未能解决你的问题,请参考以下文章

linux系统压缩与解压缩工具使用方法

#11 压缩与解压缩

AIX 上压缩与解压缩等常用命令

AIX 上压缩与解压缩等常用命令

AIX 上压缩与解压缩等常用命令

AIX 上压缩与解压缩等常用命令