Linux下的文件压缩与解压

场景描述:为了节省磁盘空间,提高磁盘空间的使用效率,方便对批量文件的传输和管理,引入了文件压缩技术。其原理简单来说就是将原先未被数据占用的空间(每字节下未被使用的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

原文地址:https://www.cnblogs.com/centos-Paul/p/9548793.html