2018-3-6Linux系统管理(8)压缩与解压缩工具、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
	   调试执行

原文地址:http://blog.51cto.com/tianxie/2084126

时间: 2024-10-04 07:01:39

2018-3-6Linux系统管理(8)压缩与解压缩工具、bash交互的相关文章

Java.util.zip 压缩与解压缩工具类

Java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类. 还包括使用 DEFLATE 压缩算法(用于 ZIP 和 GZIP 文件格式)对数据进行压缩和解压缩的类. 依赖 Jdk 编写该工具类,不依赖任何第三方 jar,随用随取,实现功能大体如下: 1.目录级别递归压缩与解压缩 zip: 2.单文件压缩和解压缩 zip : import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipIn

Linux压缩与解压缩工具

一.简述 压缩是一种通过特定的算法来减少计算机文件大小的机制,因减少文件的大小,使文件能通过网络实现更快传输,此外还减少了文件的磁盘占用空间.反向就是解压缩 二,工具 1,compress / umcompress 后缀名 .Z,很老的压缩工具,已经过时了. 2,gip , bzip2, xz (1) gzip / gunzip :压缩 / 解压缩 都会删除原文件 语法:gzip [选项] 压缩(解压缩)文件名 后缀名:.gz #    常用选项: #    -# : 压缩比,默认为6,范围1到

打包压缩、解压缩工具详解

本文旨在学习打包,压缩,解压缩.学习使用tar.gzip/gunzip/zcat.bzip2/bunzip2/bzcat.xz/unxz/xzcat.zip/unzip.cpio等命令的使用. 前言: 首先要弄清两个概念:打包是指将一大堆文件或目录变成一个总的文件:压缩则是将一个大的文件通过一些压缩算法变成一个小文件.这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2

压缩及解压缩工具

压缩和解压缩工具 压缩比 目的:时间换空间 CPU的时间 --> 磁盘空间 compress/uncompress, .Z gzip/gunzip, .gz bzip2/bunzip2, .bz2 xz/unxz, .xz zip/unzip lzma/unlzma,lzma tar,cpio compress: -d:解压缩 -c:结果输出至标准输出,不删除原文件 -v:显示详情 uncompress:解压缩 zcat file.Z > file加压缩,保留原文件 1.gip/gunzip/

Linux 压缩与解压缩工具gzip/gunzip

gzip会压缩原文件并将原文件删除 -d 解压缩选项 类似于gunzip -# 指定压缩比 默认是6 -c 将压缩内容输出到标准输出上,并保留原文件 出现了压缩文件,但是原文件没有了. 现在解压缩 解压缩完成后,压缩文件消失了. 上面这个例子是将原文件压缩后的字符输出到标准输出上 就是将压缩文件的字符重定向到其他文件 gunzip 就是对gzip的压缩文件进行解压缩 原文地址:http://blog.51cto.com/yueyue207/2085786

Linux 压缩与解压缩工具之xz

-d 解压缩 -# 指定压缩比 -k 保留原文件 现在压缩并保留原文件 也可以通过unxz解压缩 不解压查看文件内容 原文地址:http://blog.51cto.com/yueyue207/2085794

Linux 压缩与解压缩工具 bzip2/bunzip2

与gzip一样,-d解压缩 -# 指定压缩比 -k 保留文件 解压缩 如果想不解压缩文件,但是想看文件内容可以使用bzcat 保留了原文件 原文地址:http://blog.51cto.com/yueyue207/2085791

Zip - 压缩、解压缩工具

下载地址:https://itunes.apple.com/cn/app/id1175701165?mt=8 一款精致而实用的文件管理App,提供了丰富的文件操作.如果您不经常鼓捣文件,那没关系,把它作为一款图片管理软件吧!还等什么,快下载吧! 特色功能:无线上传.手势锁.定制主题. 便捷功能:图片浏览器.小说阅读器.音乐播放器.视频播放器.文件压缩器.文件解压器.系统剩余空间提示.中文.English系统语言支持. 支持打开的文件类型包括:图片.视频.文档.网页.压缩包(zip,rar,7z)

jspacker压缩及解压缩研究(js eval)

起因: 在研究爬虫的时候发现很多网站都出现了同一种方式的js混淆,并且名字都是pde.js,怀疑是使用了同一款混淆工具,所以研究一下. 这款工具叫JS Packer,并不是专门的混淆工具,而是一款js压缩工具,其官网地址为: http://dean.edwards.name/packer/ 支持两种压缩方式,一种是Shrink variables比较常规的压缩方式,就是去掉一些空白符注释之类的,另一种是Base62 encode,是一种比较适合用来压缩内容单词重复率高的压缩方式. 压缩示例 所有