Linux文件压缩和打包

Linux文件压缩和打包

一、压缩打包介绍

  • 常见压缩文件

~Windows .rar .7z .zip

~Linux .zip .gz .bz2 .xz .tar.gz .tar.bz2 .tar.xz

  • 文件压缩的作用:1、节省空间

​ 2、传输时间缩短

​ 3、节省带宽(机房的贷款与家用带宽价格不同,家用的100M带宽上传小于下载,机房

​ 的100M带宽上传等于下载。)

  • 文件后缀名:在linux下文件名变得没这么重要,如果我们想要通过后缀名去判断文件的类型就变得比较困难

    ​ 了,为了便利大家,应该遵循这种无形的约定,设置成压缩的后缀名,压缩工具也会在压缩文

    ​ 件后默认生成这种后缀名。

二、压缩工具

  • gzip压缩工具

压缩文件之前的大小和压缩文件之后再解压的文件大小不一样,是因为压缩文件之前文件中是存在空隙的“虚的”,压缩文件之后再解压,把空隙都排除后得到真实的大小,内容是不变的。

1、准备一个大点用来压缩的文件

[[email protected] d6z]# find /etc/ -type f -name "*conf"  ##查找带“*conf”后缀的文件
.
.
.
##把查找出来的所有文件内容追加到1.txt文件里去
[[email protected] d6z]# find /etc/ -type f -name "*conf" -exec cat {} >> 1.txt \;
[[email protected] d6z]# ls
1.txt
[[email protected] d6z]# du -sh 1.txt  ##查看1.txt文件的大小
212K    1.txt
##多次重复追加内容到1.txt文件,把文件变的大些,好做实验。
[[email protected] d6z]# find /etc/ -type f -name "*conf" -exec cat {} >> 1.txt \;
[[email protected] d6z]# du -sh 1.txt
448K    1.txt
[[email protected] d6z]# find /etc/ -type f -name "*conf" -exec cat {} >> 1.txt \;
[[email protected] d6z]# du -sh 1.txt
704K    1.txt
[[email protected] d6z]# find /etc/ -type f -name "*conf" -exec cat {} >> 1.txt \;
[[email protected] d6z]# du -sh 1.txt
1.2M    1.txt
[[email protected] d6z]# find /etc/ -type f -name "*conf" -exec cat {} >> 1.txt \;
[[email protected] d6z]# du -sh 1.txt
1.2M    1.txt
[[email protected] d6z]# find /etc/ -type f -name "*conf" -exec cat {} >> 1.txt \;
[[email protected] d6z]# du -sh 1.txt  ##重复5次追加实际上是1M左右,但由于文件有空隙显示2.2M
2.2M    1.txt
[[email protected] d6z]# wc -l 1.txt  ##查看文件的行数
32394 1.txt
[[email protected] d6z]# 

![Linux文件压缩和打包

]()

2、压缩解压1.txt文件

[[email protected] d6z]# du -sh 1.txt
2.2M    1.txt
[[email protected] d6z]# wc -l 1.txt
32394 1.txt
[[email protected] d6z]# gzip 1.txt  ##压缩
[[email protected] d6z]# ls
1.txt.gz
[[email protected] d6z]# du -sh 1.txt.gz  ##压缩后文件的大小
320K    1.txt.gz
[[email protected] d6z]# gzip -d 1.txt.gz  ##解压
[[email protected] d6z]# ls
1.txt
[[email protected] d6z]# du -sh 1.txt  ##解压后文件的大小,这才是该文件排除空隙后的大小,而不是2.2M
1.3M    1.txt
[[email protected] d6z]# wc -l 1.txt  ##行数没变,证明没有删除数据
32394 1.txt
[[email protected] d6z]# 

3、压缩级别:有1~9级,数字越大压缩文件越小,默认级别为6级。

[[email protected] d6z]# du -sh 1.txt.gz  ##默认压缩等级为6
320K    1.txt.gz
[[email protected] d6z]# gzip -d 1.txt.gz
[[email protected] d6z]# ls
1.txt
[[email protected] d6z]# du -sh 1.txt
1.3M    1.txt
[[email protected] d6z]# gzip -1 1.txt
[[email protected] d6z]# ls
1.txt.gz
[[email protected] d6z]# du -sh 1.txt.gz
376K    1.txt.gz
[[email protected] d6z]# 

![Linux文件压缩和打包

]()

4、另一种解压方式

[[email protected] d6z]# gunzip 1.txt.gz
[[email protected] d6z]# ls
1.txt
[[email protected] d6z]# du -sh 1.txt
1.3M    1.txt

5、查看压缩文件

[[email protected] d6z]# file 1.txt.gz  ##查看压缩文件
##描述gzip的压缩数据,是1.txt,基于Unix,最后更改时间,压缩级别
1.txt.gz: gzip compressed data, was "1.txt", from Unix, last modified: Thu May 24 23:17:23 2018
[[email protected] d6z]# 
[[email protected] d6z]# zcat 1.txt.gz  ##这种方法是先解压后用cat查看文件内容

6、正常压缩文件后,源文件消失,生成一个压缩文件;现在要求在压缩文件后源文件和压缩文件同时存在。

[[email protected] d6z]# gzip -c 1.txt > /tmp/d6z/1.txt.gz
[[email protected] d6z]# ls
1.txt  1.txt.gz
[[email protected] d6z]# 

7、正常解压文件后,解压文件消失,生成原来的文件;现在要求在解压文件后源文件和压缩文件同时存在。

[[email protected] d6z]# ls
1.txt.gz
[[email protected] d6z]# gzip -d -c /tmp/d6z/1.txt.gz > /tmp/d6z/2.txt  ##解压后的文件可以改名字
[[email protected] d6z]# ls  ##压缩文件和解压出来的文件同时存在
1.txt.gz  2.txt

8、gzip不能压缩目录

  • bzip2压缩工具

和gzip的算法不一样,压缩更狠,意味耗费资源更多。

1、安装bzip2

[[email protected] d6z]# yum install -y bzip2

2、用bzip2压缩文件大小变化

[[email protected] d6z]# du -sh 1.txt
1.3M    1.txt
[[email protected] d6z]# bzip2 1.txt
[[email protected] d6z]# du -sh 1.txt.bz2
132K    1.txt.bz2

3、解压

[[email protected] d6z]# bzip2 -d 2.txt.bz2
[[email protected] d6z]# ls
1.txt.bz2  2.txt
[[email protected] d6z]# bunzip2 1.txt.bz2
[[email protected] d6z]# ls
1.txt  2.txt

4、bzip2同样不支持压缩目录

5、支持-c指定压缩到路径下

[[email protected] d6z]# bzip2 -c 1.txt > /tmp/1.txt.bz2
[[email protected] d6z]# cd ..
[[email protected] tmp]# ls
1.txt.bz2  ##在这里
1.txt.gz
d6z
newdisk
passwd
systemd-private-3cc8878ddc334a33ac0d23465aeca5ca-chronyd.service-SYWbiK
systemd-private-3cc8878ddc334a33ac0d23465aeca5ca-vgauthd.service-nwIqXd
systemd-private-3cc8878ddc334a33ac0d23465aeca5ca-vmtoolsd.service-M4EvIt
systemd-private-4efcd9bf13934eea8a7d9731c7b92cb4-chronyd.service-KkED72
systemd-private-4efcd9bf13934eea8a7d9731c7b92cb4-vgauthd.service-Zezhni
systemd-private-4efcd9bf13934eea8a7d9731c7b92cb4-vmtoolsd.service-JLNlEx
[[email protected] tmp]# cd d6z
[[email protected] d6z]# ls  ##源文件还在
1.txt  2.txt
[[email protected] d6z]# du -sh /tmp/1.txt.bz2
132K    /tmp/1.txt.bz2

6、用样支持-c解压改名字

[[email protected] d6z]# bzip2 -d -c /tmp/1.txt.bz2 > 3.txt
[[email protected] d6z]# ls
1.txt  2.txt  3.txt
[[email protected] d6z]# cd ..
[[email protected] tmp]# ls
1.txt.bz2
1.txt.gz

7、压缩级别:bzip2默认是9级别

[[email protected] d6z]# du -sh 3.txt
1.3M    3.txt
[[email protected] d6z]# bzip2 -9 3.txt  ##加不加-9都是132K
[[email protected] d6z]# du -sh 3.txt.bz2
132K    3.txt.bz2

8、同样可以用file看压缩文件的信息

[[email protected] d6z]# file 3.txt.bz2
3.txt.bz2: bzip2 compressed data, block size = 900k

9、故意把压缩文件更改为普通本文文件

[[email protected] d6z]# ls
1.txt  2.txt  3.txt.bz2
[[email protected] d6z]# mv 3.txt.bz2 3.txt  ##故意更改文件格式
[[email protected] d6z]# ls
1.txt  2.txt  3.txt
[[email protected] d6z]# less 3.txt  ##会显示是个二进制文件,询问是否打开
"3.txt" may be a binary file.  See it anyway? 
[[email protected] d6z]# file 3.txt  ##用file可以查看文件格式,显示bzip2
3.txt: bzip2 compressed data, block size = 900k
[[email protected] d6z]# file 1.txt  ##普通文本文档显示是text格式
1.txt: C source, UTF-8 Unicode text, with very long lines
[[email protected] d6z]# less 1.txt
[[email protected] d6z]# mv 3.txt 3.txt.bz2  ##把名字改回来
[[email protected] d6z]# ls
1.txt  2.txt  3.txt.bz2

10、查看压缩文件

[[email protected] d6z]# bzcat 3.txt.bz2

  • xz压缩工具

xz压缩比bzip2压缩要狠,bzip2比gzip要狠。但不绝对,要看内容是否适合该种格式。

1、xz压缩

[[email protected] d6z]# xz 2.txt
[[email protected] d6z]# ls
1.txt  2.txt.xz  3.txt.bz2
[[email protected] d6z]# du -sh 2.txt.xz  ##1.3M压缩成48K
48K 2.txt.xz
[[email protected] d6z]# du -sh 1.txt
1.3M    1.txt

2、xz的两种解压方法

[[email protected] d6z]# ls
1.txt  2.txt.xz  3.txt.bz2
[[email protected] d6z]# xz -d 2.txt.xz  ##第一种
[[email protected] d6z]# ls
1.txt  2.txt  3.txt.bz2
[[email protected] d6z]# xz 2.txt
[[email protected] d6z]# ls
1.txt  2.txt.xz  3.txt.bz2
[[email protected] d6z]# unxz 2.txt.xz  ##第二种
[[email protected] d6z]# ls
1.txt  2.txt  3.txt.bz2

3、支持-c指定压缩到路径下并保留源文件

[[email protected] d6z]# xz -c 2.txt > /tmp/2.txt.xz

4、用样支持-c解压指定路径改名字同时保留原来的压缩文件

[[email protected] d6z]# xz -d -c /tmp/2.txt.xz > ./4.txt  ##重定向到当前目录的4.txt

5、查看压缩文件

[[email protected] d6z]# xzcat /tmp/2.txt.xz

6、xz同样不支持压缩目录

7、xz默认压缩级别是6

  • zip压缩工具

zip支持压缩目录,Linux是默认不支持解压Windows下的zip文件,需要安装一个工具。很少把rar的文件放到Linux下

1、安装zip

[[email protected] d6z]# yum install -y zip       

2、用zip压缩文件

[[email protected] d6z]# du -sh 2.txt
1.3M    2.txt
[[email protected] d6z]# zip 2.txt.zip 2.txt
  adding: 2.txt (deflated 75%)
[[email protected] d6z]# ls
1.txt  2.txt  2.txt.zip  3.txt.bz2  4.txt  zyshan
[[email protected] d6z]# du -sh 2.txt.zip
320K    2.txt.zip

用zip压缩文件和目录,zip有个特点就是压缩后源文件和目录不会消失

[[email protected] d6z]# zip -r zys.zip 2.txt zyshan
  adding: 2.txt (deflated 75%)
  adding: zyshan/ (stored 0%)
  adding: zyshan/2.txt (stored 0%)
  adding: zyshan/4.txt (deflated 75%)
  [[email protected] d6z]# ls
1.txt  2.txt  2.txt.zip  3.txt.bz2  4.txt  zyshan  zys.zip
[[email protected] d6z]# du -sh zys.zip
640K    zys.zip

3、解压,先安装unzip

[[email protected] d6z]# yum install -y unzip

由于源文件没有消失,所以解压是它会询问你是否y覆盖、n不覆盖、A全部覆盖、N全部不覆盖、r改名

[[email protected] d6z]# unzip zys.zip
Archive:  zys.zip
replace 2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
  inflating: 2.txt                   
replace zyshan/2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace zyshan/4.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: a
error:  invalid response [a]
replace zyshan/4.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
  inflating: zyshan/4.txt   

4、默认解压到当前目录,也可以解压到指定目录

[[email protected] d6z]# mkdir text
[[email protected] d6z]# ls
1.txt  2.txt  2.txt.zip  3.txt.bz2  4.txt  text  zyshan  zys.zip
[[email protected] d6z]# unzip 2.txt.zip -d text/
Archive:  2.txt.zip
  inflating: text/2.txt              
[[email protected] d6z]# tree text/
text/
└── 2.txt

0 directories, 1 file

在解压到指定目录的时候,不支持改名字;它会新建一个你想改名字的目录,再把压缩文件解压进去,名字没变

[[email protected] d6z]# unzip 2.txt.zip -d text/aa.txt
Archive:  2.txt.zip
  inflating: text/aa.txt/2.txt       
[[email protected] d6z]# tree text/
text/
├── 2.txt
└── aa.txt
    └── 2.txt

1 directory, 2 files
[[email protected] d6z]# cd .
[[email protected] d6z]# cd text
[[email protected] text]# ls
2.txt  aa.txt
[[email protected] text]# cd aa.txt
[[email protected] aa.txt]# ls
2.txt

5、zip是不支持查看它的压缩包内容,仅支持用-l查看压缩包列表

[[email protected] d6z]# ls
1.txt  2.txt  2.txt.zip  3.txt.bz2  4.txt  text  zyshan  zys.zip
[[email protected] d6z]# unzip -l zys.zip
Archive:  zys.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
  1296834  05-25-2018 00:10   2.txt
        0  05-27-2018 10:52   zyshan/
        0  05-27-2018 10:50   zyshan/2.txt
  1296834  05-27-2018 10:52   zyshan/4.txt
---------                     -------
  2593668                     4 files

三、tar打包工具

先区分两个概念:打包和压缩。

打包是指将许多的文件或目录变成一个总的文件(打包文件大小变化不大,不用算法),压缩则是将一个大的文件通过压缩算法变成一个小文件(解压耗时很长)。

区分这两个概念的原因:其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩许多文件时,你就得先借助另外的工具将这许多文件先打成一个包,然后再用原来的压缩程序进行压缩。

1、tar打包目录,打包一个已存在的包,它会覆盖原来的包。

[[email protected] d6z]# tar -cvf zyshan.tar zyshan/  ##c是创建,v是可视化,f是跟tar包名
zyshan/
zyshan/2.txt
zyshan/4.txt

可以目录和文件、压缩包一起打包,当然了肯定会覆盖了原先的包

[[email protected] d6z]# ls
1.txt  2.txt  2.txt.zip  3.txt.bz2  4.txt  text  zyshan  zyshan.tar  zys.zip
[[email protected] d6z]# tar -cvf zyshan.tar zyshan/ 1.txt 2.txt.zip
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip

2、解包,解开的文件也会覆盖原来被打包的文件吗,不会有提示

[[email protected] d6z]# tar -xvf zyshan.tar
zyshan/
zyshan/2.txt
zyshan/4.txt

3、用-tf查看tar包列表

[[email protected] d6z]# tar -tf zyshan.tar
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip

4、用--exclude选项过滤不想打包的文件或目录,但不支持后面跟多个目录或文件,只限一个

##过滤文件2.txt再打包
[[email protected] d6z]# tar -cvf zyshan.tar zyshan/ --exclude 2.txt 1.txt 2.txt.zip
zyshan/
zyshan/4.txt
1.txt
2.txt.zip
##过滤1.txt和2.txt.zip再打包
[[email protected] d6z]# tar -cvf zyshan.tar --exclude 1.txt --exclude 2.txt.zip zyshan/ 1.txt 2.txt.zip
zyshan/
zyshan/2.txt
zyshan/4.txt
##过滤通配带.txt的文件再打包
[[email protected] d6z]# tar -cvf zyshan.tar --exclude "*.txt"  zyshan/ 1.txt 2.txt.zip
zyshan/
2.txt.zip

四、tar打包并压缩

1、tar打包并压缩gzip,在-cvf中加z变为-czvf

[[email protected] d6z]# tar -czvf zyshan.tar zyshan/ 1.txt 2.txt.zip  ##打包压缩一起
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip
[[email protected] d6z]# du -sh zyshan.tar  ##文件大小变小
956K    zyshan.tar
[[email protected] d6z]# tar -czvf zyshan.tar.gz zyshan/ 1.txt 2.txt.zip  ##改名字好区分
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip
[[email protected] d6z]# du -sh zyshan.tar.gz  ##打包压缩前后对比
956K    zyshan.tar.gz
[[email protected] d6z]# du -sh zyshan/ 1.txt 2.txt.zip
1.3M    zyshan/
1.3M    1.txt
320K    2.txt.zip

2、tar打包并压缩bzip2,在-cvf中加j变为-cjvf

[[email protected] d6z]# tar -cjvf zyshan.tar.bz2 zyshan/ 1.txt 2.txt.zip
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip
[[email protected] d6z]# du -sh zyshan.tar.bz2
540K    zyshan.tar.bz2

3、tar打包并压缩xz,在-cvf中加J变为-cJvf

[[email protected] d6z]# tar -cJvf zyshan.tar.xz zyshan/ 1.txt 2.txt.zip
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip
[[email protected] d6z]# du -sh zyshan.tar.xz
332K    zyshan.tar.xz

4、解包解压,只需要把选项-c改为-x就可以了

5、查看列表和查看tar包列表一样

[[email protected] d6z]# tar -tf zyshan.tar.gz
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip
[[email protected] d6z]# tar -tf zyshan.tar.bz2
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip
[[email protected] d6z]# tar -tf zyshan.tar.xz
zyshan/
zyshan/2.txt
zyshan/4.txt
1.txt
2.txt.zip

五、延伸拓展

http://ask.apelearn.com/question/5435