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]#
![
]()
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]#
![
]()
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