场景描述:为了节省磁盘空间,提高磁盘空间的使用效率,方便对批量文件的传输和管理,引入了文件压缩技术。其原理简单来说就是将原先未被数据占用的空间(每字节下未被使用的bit)进行重新规划和分配,以达到在有限的空间内尽可能多的存储数据的目的。具体方法如下:
一、对于单个文件而言,常用的压缩命令:compress(已淘汰)、gzip(速度最快/但压缩比最低)、bzip2(速度稍慢/但压缩比提升/比较常见)、xz(速度最慢/但压缩比最高)
在Linux系统下,gzip/bzip2/xz的用法为:
1)gzip -c/d/t//v/# 文件名 |注意,对windows下的可执行的二进制文件*.exe进行压缩时,一定不能使用选项,否则会导致终端崩溃!
-c 将要压缩的文本的数据以文字类型输出到屏幕上,可用于输出重定向
-d 解压缩
-t 检验一个压缩文件的一致性
-v 显示压缩比
-# #代表数字,1-9,9等级最高,压缩比最大,但速度最慢
注意,gzip工具压缩后直接删除了原文件,解压缩后同样删除了压缩文件。当原文件本身是纯文本时,可以尝试用zcat 文件名.gz读取解压后的文本内容!zgrep -n '关键字' 文件名.gz 过滤出包含关键字信息的行!特别地,当有需求在压缩时必须保留原文本文件,则用 gzip -c 文件名 > 文件名.gz 进行保留!
2)bzip2 -c/d/k/z/t/v# 文件名 |bizp2的用法与gzip较为相像,但多了一些额外选项:
-k 保留原文件,压缩或解压缩时不对原文件进行删除(默认同gzip一样,自动删除原文件)
-z 以默认等级进行压缩,此项可忽略
同样的,bzcat 文件名.bz2 bzgrep -n '关键字' 文件名.bz2 用法通gzip类似
3)xz -d/t/l/k/c/# 文件名 |xz 用法与bzip2较为相像,但多了一个额外选项:
-l 列出压缩文件的相关信息
同样的,xzcat 文件名.xz xzgrep -n '关键字' 文件名.xz 用法同bzip2类似
总结:从gzip到bzip2再到xz 压缩比逐步提升,相应地,压缩速度逐步减慢。相比于gzip,后两者均提供了保留原文件的选项-k,xz还提供了-l 文件名.xz功能。至于三个工具的-t(测试压缩文件完整性,以避免出错)功能则鲜有用到。
二、对于多个文件而言,用功能强大的tar命令进行处理!类似于windows下的Winrar。
tar 命令选项及参数甚多,以下仅列出常用的:
-c:建立打包文件,可搭配-v 显示过程
-t:查看打包文件的文件名(哪些文件被打包)
-x:解打包或解压缩,可搭配-C 指定解打包或解压缩后文件保存目录
注意,以上三个选项无法同时出现!
-z:通过gzip支持压缩/解压缩,此时的文件名后缀最好是*.tar.gz
-j:通过bzip2支持压缩/解压缩,此时文件名后缀最好是*.tar.bz2
-J:通过xz支持压缩/解压缩,此时文件名后缀最好是*.tar.xz
注意,以上三个选项无法同时出现!
-v:显示细节
-f filename:注意,-f后要紧接要处理的文件名
-C 目录:配合x选项,将文件解压到指定目录
-p:保留备份数据原文本的权限及属性,常用于备份重要的配置文件
-P:保留绝对路径,即允许备份数据中含有根目录!
--exclude=FILE 在压缩过程之中不将FILE打包
关于tar命令最最常用的无外乎以下三种格式:
format1 打包并压缩 tar -jcvf filename.tar.bz2 要被压缩的目录或文件名称
format2 查询tar包内容 tar -jtvf filename.tar.bz2
format3 解tar包 tar -jxvf filename.tar.bz2 [-C 目录] 解开tar包 [到指定目录]
下面给出几个示例,看下tar命令的具体用法:
例1.将/etc/下的所有文件打包至/app下,并名命为etc.tar.bz2
[root@www app]# tar -jpcvf /app/etc.tar.bz2 /etc
可见tar命令如此强大,借助于-j(调用bzip2)备份后只有9.1M,相比于41M的源,真是小了不少!另外我们使用了-p,这在备份中很常用!需要特别注意的是,在生成tar包过程中,自动去除“/”,为的是在做解包操作时,不覆盖源!!!下面我们赶紧看下这个tar包的内容:
[root@www app]# tar -tf etc.tar.bz2
篇幅较大,仅截取部分内容。注意!查看tar包内容时无需加-z/j/J,tar命令会自动识别包类型,想显示细节如属性权限等,可加-v
接下来我们将这个tar包解压到/app/testdir下
[root@www app]# tar -xvf etc.tar.bz2 -C ./testdir/
注意,此时在testdir下生成了一个etc目录,所有的源均放在了此目录下!
例2.只解压出例1的tar包中的etc/shadow这一个文件,其他不动
方法很简单,执行命令:
[root@www app]# tar -xvf etc.tar.bz2 etc/shadow
发现,在生成的etc目录下,仅有shadow这一个文件!
例3.打包备份/etc下所有比/etc/passwd文件的mtime时间更新的文件,包名为etc.newer.tar.bz2,放在/app下
处理过程也很简单,调用--newer-mtime="2018/08/24"选项即可:(已通过stat查看了/etc/passwd文件的mtime)
[root@www app]# tar -jpcvf /app/etc.newer.tar.bz2 --newer-mtime="2018/08/24" /etc
补充说明:
如果单纯对多个文件进行打包(仅打包,生成*.tar文件,不调用gzip/bzip2/xz等工具)那么最终的文件,我们称为tarfile
如果调用了压缩工具(-z/j/J)最终生成的*.tar.gz/bz2/xz,我们称之为tarball