[TOC]

0x00 快速入门

Linux中最常见的压缩格式有:.zip .gz .bz2 .tar.gz .tar.bz2 .xz .rar .tgz

  • 通过打包.tar解决.gz和.bz2压缩目录的不便之处,所以常用压缩格式.tar.gz和.tar.bz2格式代替

打包和压缩两个概念:
答:可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的;

  • 打包是指将一大堆文件或目录变成一个总的文件
  • 压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

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


tar 命令

描述:tar命令为linux的文件和目录创建档案,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。
WeiyiGeek.tar参数

实例演示:

#示例1.将文件全部打包成 tar包和tar.gz 与 tar.bz2
tar -cvf log.tar log.log #仅打包不压缩 | -f 指定压缩文件名称
tar -zcvf log.tar.gz log.log #打包后以gzip压缩
tar -jcvf log.tar.bz2 log.log #打包后以bzip2压缩


#示例2.打包和压缩tar.gz命令并且进行解压
tar -zcvf test.tar.gz test.jsp #-c: 打包项
tar -zxvf test.tar.gz       #-x:为解压选项
tar -zxvf test.tar.tgz   #可以直接解压tgz为后缀的文件

tar -jcvf test.tar.bz2 test.jsp
tar -jxvf test.tar.bz2     


#示例3.解压到指定文件
tar -zxvf test.tar.gz -C /tmp  #-C解压到指定的目录
tar -xz -C my_directory --strip-components=1
drwx------ root/root 0 2019-06-03 14:46 ./yum_save_tx.2019-05-29.11-23.JTFrPb.yumtx


#示例4.查阅上述tar包内有哪些文件并只将tar内的部分文件解压出来
tar -ztvf test.tar.gz   #-t 查看压缩包内容
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log #如果单只要一个文件,就可以透过这个方式来解压部分文件!


#示例5.保存属性打包并且排序备份文件夹里面的文件或者目录
tar -zcvpf log31.tar.gz log2014.log log2015.log #-p 打包属性及其权限
tar -zcvf scf.tar.gz scf/* --exclude scf/service #--exclude=排除文件 *.gif  排除目录 /xx/xx/*
tar -zcvf wwwroot.ta.gzr /home/public_html/ --exclude=*.gif


#示例6.在文件夹当中,比某个日期新的文件才备份:
tar -N "20160529" -zcvf time.tar.gz
# tar: 选项 --after-date: 将日期 ‘20160529’ 当作 2016-05-29 00:00:00
# ./.Test-unix/
# ./yum_save_tx.2019-05-29.11-23.JTFrPb.yumtx


#示例7.添加新的文件到tar归档备份中
$tar -cvf test.tar /root/.bash_history
$tar -rvf test.tar yum_save_tx.2019-05-29.11-23.JTFrPb.yumtx
yum_save_tx.2019-05-29.11-23.JTFrPb.yumtx
$tar -tvf test.tar
-rw------- root/root 1258 2012-07-31 17:44 root/.bash_history
-rw------- root/root 29154 2019-05-29 11:23 yum_save_tx.2019-05-29.11-23.JTFrPb.yumtx
```

<hr>

#### gzip 命令
gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用,不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式,据统计gzip命令对文本文件有60%~70%的压缩率。

_减少文件大小的好处:_
- 一是可以减少存储空间
- 二是通过网络传输文件时,可以减少传输的时间

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

![WeiyiGeek.gzip参数](https://raw.githubusercontent.com/WeiyiGeek/blogimage/master/2019/20190603152309.png)

实例演示:
```bash
#示例1.将当期目录下每一个文件压缩成为.gz文件并解压.gz文件
$gzip * #压缩会删除原文件
#gzip: www is a directory -- ignored 默认会忽悠目录
-rw-r--r-- 1 root root 30 6月 3 15:26 test.jsp.gz #会删除原文件

$gzip -dv * #解压会删除.gz备份文件
gzip -d test.gz #解压单个文件
test.jsp.gz: -200.0% -- replaced with test.jsp

WeiyiGeek.gzip解压

#示例2.保留源文件压缩并两种方式进行解压
gzip -c 源文件 > 压缩文件 # -c 源文件被保留
gzip -c test.jsp > test.jsp.gz  #注意压缩文件名名称(最好和源文件一致)
gunzip -c test.gz > filename #Linux解压缩保留源文件的方法:
gzip -dc /home/urpm/rpmbuild/SOURCES/nginx-1.16.0.tar.gz #保留源文件

#示例3.详细显示例1中每个压缩的文件的信息,并不解压
gzip -l * 
compressed uncompressed ratio uncompressed_name
26 1 -200.0% demo
26 1 -200.0% test

#示例4.只能压缩目录下所有的子文件,但不能压缩目录
gzip -r 目录
gzip -r test/
#这样所有test下面的文件都变成了*.gz,目录依然存在只是目录里面的文件相应变成了*.gz.这就是压缩,和打包不同。因为是对目录操作,所以需要加上-r选项,这样也可以对子目录进行递归了。
gzip -rvf test6/
gzip -rvf /tmp #递归压缩 默认后缀名为gz
# /tmp//demo: -200.0% -- replaced with /tmp//demo.gz
# /tmp//test: -200.0% -- replaced with /tmp//test.gz
# /tmp//test.jsp.gz: 21.2% -- replaced with /tmp//test.jsp.gz.gz
# /tmp//www/test.jsp: -100.0% -- replaced with /tmp//www/test.jsp.gz
gzip -drv * #递归解压
# demo.gz: -200.0% -- replaced with demo
# test.gz: -200.0% -- replaced with test
# test.jsp.gz.gz: 21.2% -- replaced with test.jsp.gz
# www/test.jsp.gz: -100.0% -- replaced with www/test.jsp

WeiyiGeek.递归压缩解压

#示例5.利用gzip压缩tar成为tar.gz文件
tar -cvf test.jsp.tar test.jsp
gzip test.tar
# -rw-r--r-- 1 root root 138 4月  25 14:28 test.jsp.tar.gz

#示例6.利用gzip验证压缩包是否完整
$gzip -vt www1.gz
www1.gz: OK

bzip2命令

描述:bzip2命令用于创建和管理(包括解压缩)“.bz2”格式的压缩包。
WeiyiGeek.bzip2参数

示例案例:

#示例1.利用bzip2压缩后源文件会被删除,保留源文件压缩
bzip2 源文件
$bzip2 test.jsp   
test.jsp.bz2

bzip2 -k 源文件    #源文件被保留,此命令不能压缩目录!
bzip2 -k test.jsp


#示例2.压缩指定文件filename并强制覆盖:
#这里压缩的时候不会输出,会将原来的文件filename给删除,替换成filename.bz2.如果以前有filename.bz2则不会替换并提示错误(如果想要替换则指定-f选项,
bzip2 -z filename
#例如 bzip2 -f filename;如果filename是目录则也提醒错误不做任何操作;如果filename已经是压过的了有bz2后缀就提醒一下,不再压缩,没有bz2后缀会再次压缩。


#示例3.解压指定文件
#解压的时候没标准输出,会将原来的文件filename.bz2给替换成filename。如果以前有filename则不会替换并提示错误(如果想要替换则指定-f选项,例如bzip2 -df filename.bz2)
bzip2 -d test.jsp.bz2
bunzip2 test.jsp.bz2
#保留源文件解压
bzip2 -k -d 压缩文件 = bunzip2 -k 压缩文件


#示例4.显示压缩验证
bzip2 -tv test.jsp.bz2


#示例5.压缩到标准输出并且解压到标准输出:
$bzip2 -c filename #使用-c指定压缩到标准输出不删除原有文件,不同的是,压缩后的文件无法输出到标准输出。
bzip2: I won't write compressed data to a terminal. '
bzip2: For help, type: `bzip2 --help`.
$bzip2 -dc filename.bz2 #使用c指定到标准输出,输出的是文件的filename的内容,不会讲filename.bz2删除


#示例6.使用bzip2的时候将所有后面看做文件(即使文件名以'-'开头),这里主要是防止歧义
bzip2 -- test.log
-rw-r--r-- 1 root root 553 6月 3 15:55 test.log.bz2


#示例7.利用bzip2来压缩/解压tar成为tar.bz2
$tar -cvf test.jsp.tar test.jsp
$bzip2 test.jsp.tar
test.jsp.tar.bz2
#可以在解压缩命令后加上-C 指定目录将解压出来的文件放到其他目录
tar -jcvf 压缩包名.tar.bz2 源文件 -C /tmp/   # c压缩
tar -jxvf 压缩包名.tar.bz2           # x解压缩
tar -jtvf 压缩包名.tar.bz2               #查看压缩包内容


zip 命令

Linux中zip压缩和unzip解压缩命令详解,zip命令可以用来解压缩文件,或者对文件进行打包操作,zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件。

#参数
zip压缩包:指定要创建的zip压缩包
文件列表:指定要压缩的文件列表

#选项
-A:调整可执行的自动解压缩文件;
-b<工作目录>:指定暂时存放文件的目录;
-c:替每个被压缩的文件加上注释;
-d:从压缩文件内删除指定的文件;
-D:压缩文件内不建立目录名称;
-f:此参数的效果和指定“-u”参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中;
-F:尝试修复已损坏的压缩文件;
-g:将文件压缩后附加在已有的压缩文件之后,而非另行建立新的压缩文件;
-h:在线帮助;
-i<范本样式>:只压缩符合条件的文件;
-j:只保存文件名称及其内容,而不存放任何目录名称;
-J:删除压缩文件前面不必要的数据;
-k:使用MS-DOS兼容格式的文件名称;
-l:压缩文件时,把LF字符置换成LF+CR字符;
-ll:压缩文件时,把LF+cp字符置换成LF字符;
-L:显示版权信息;
-m:将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中;
-n<字尾字符串>:不压缩具有特定字尾字符串的文件;
-o:以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同;
-q:不显示指令执行过程;
-r:递归处理,将指定目录下的所有文件和子目录一并处理;
-S:包含系统和隐藏文件;
-t<日期时间>:把压缩文件的日期设成指定的日期;
-T:检查备份文件内的每个文件是否正确无误;
-u:更换较新的文件到压缩文件内;
-v:显示指令执行过程或显示版本信息;
-V:保存VMS操作系统的文件属性;
-w:在文件名称里假如版本编号,本参数仅在VMS操作系统下有效;
-x<范本样式>:压缩时排除符合条件的文件;
-X:不保存额外的文件属性;
-y:直接保存符号连接,而非该链接所指向的文件,本参数仅在UNIX之类的系统下有效;
-z:替压缩文件加上注释;
-$:保存第一个被压缩文件所在磁盘的卷册名称;
-<压缩效率>:压缩效率是一个介于1~9的数值。

实际案例:

#示例1.zip解压缩
zip 压缩文件名 原文件 #压缩文件
zip -r 压缩文件名 源目录 #压缩目录

zip test.zip test.jsp #zip 压缩后的名字 源文件
zip -r test.zip test/ #zip 压缩目录文件 源文件目录
zip -r abc123.zip abc 123.txt #把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip

#示例2.将/home/Blinux/html/这个目录下所有文件和文件夹打包为当前目录下的html.zip:
zip -q -r html.zip /home/Blinux/html #将绝对地址的文件及文件夹进行压缩
zip -q -r html.zip * #将相对路径目录的文件及文件夹进行压缩

补充:unzip命令

#参数
-c:将解压缩的结果
-l:显示压缩文件内所包含的文件
-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换
-t:检查压缩文件是否正确
-u:与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其它文件解压缩到目录中
-v:执行是时显示详细的信息
-z:仅显示压缩文件的备注文字
-a:对文本文件进行必要的字符转换
-b:不要对文本文件进行字符转换
-C:压缩文件中的文件名称区分大小写
-j:不处理压缩文件中原有的目录路径
-L:将压缩文件中的全部文件名改为小写
-M:将输出结果送到more程序处理
-n:解压缩时不要覆盖原有的文件
-o:不必先询问用户,unzip执行后覆盖原有文件
-P:使用zip的密码选项
-q:执行时不显示任何信息
-s:将文件名中的空白字符转换为底线字符
-V:保留VMS的文件版本信息
-X:解压缩时同时回存文件原来的UID/GID

案例使用:

#示例3.解压文件到指定目录
unzip test.zip #把/home目录下面的test.zip直接解压到/home目录里面
unzip PentextBox.zip -d /tmp/
# Archive: PentextBox.zip
# inflating: /tmp/PentextBox 工具集.txt
unzip abc\*.zip #把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面


#示例4.示例查看把/home目录下面的wwwroot.zip里面的内容
unzip -v wwwroot.zip
unzip -t wwwroot.zip #验证/home目录下面的wwwroot.zip是否完整
unzip -j wwwroot.zip #(不带路径解压)把/home目录下面wwwroot.zip里面的所有文件解压到第一级目录


rar 命令

根据习惯我们一般会试探看看当前环境中是否已经有rar、unrar的源包,如果有的话可以直接安装。不过一般是没有的,所以我们就用下面的编译方法.
安装rar压缩和解压环境:

yum install unrar -y
# 32位:https://soft.itbulu.com/php/rarlinux-5.3.0.tar.gz
# 64位:https://soft.itbulu.com/php/rarlinux-x64-5.4.b2.tar.gz

然后通过wget下载到当前机器中进行下面的编译:

wget https://soft.itbulu.com/php/rarlinux-x64-5.4.b2.tar.gz
tar -zxvf rarlinux-x64-5.4.b2.tar.gz
cd rar && make

WeiyiGeek.下载安装

案例演示:

#示例1:RAR压缩和解压文件命令
rar a itbulu.com.rar file #将file文件夹压缩到itbulu.com.rar压缩包。
rar x itbulu.com.rar #红色部分代表我们压缩包需要解压的文件名。

WeiyiGeek.解压与压缩


xz 命令

简介:xz是绝大数linux默认就带的一个压缩工具,在下载phpmyadmin的时候看到这种压缩格式的,phpmyadmin压缩包xz格式的居然比7z还要小。
是最新的archlinux某些东西就使用xz压缩,不过xz也有一个坏处就是压缩时间比较长,比7z压缩时间还长一些,不过压缩是一次性的,所以可以忽略。

案例示例:

#示例1.xz压缩文件方法或命令:
xz -z 要压缩的文件
#如果要保留被压缩的文件加上参数 -k ,如果要设置压缩率加入参数 -0 到 -9调节压缩率,如果不设置默认压缩等级是6.
xz -z -k -1 text.bat


#示例2.xz解压文件方法或命令:
xz -d 要解压的文件
xz -d -k text.xz


#示例3.创建或解压tar.xz文件的方法:
#创建tar.xz文件,只要先 tar cvf xxx.tar xxx/ 这样创建xxx.tar文件先,然后使用 xz -z xxx.tar 来将 xxx.tar压缩成为 xxx.tar.xz
tar cvf text.tar text/
xz -z -k text.tar #保存压缩前的文件
#解压tar.xz文件:先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar xvf xxx.tar来解包
xd -k -d text.tar.xz #保存解压前的文件
tar xvf text.tar