10.linux 文件与文件系统的压缩与打包

来源:互联网 发布:未注册域名查询 编辑:程序博客网 时间:2024/05/17 03:05

前言:

我们知道在windows中,压缩与解压缩一个文件很简单和容易,随便下载一个压缩软件:WinRAR,好压,7zip啥的,很容易。
而且后缀是.rar或者是.zip的。我们一看就是一个压缩过的文件,但是在Linux中,扩展名不代表一个文件的类型,没有什么很特殊的意义的。
最关键是压缩文件能快点下载,压缩空间,在Linux中很实用。

一. 压缩文件的用途与技术

1.压缩

压缩顾名思义,就是一个很大的东西又是挤压又是缩小的变成一个小的东西,比如一床被子我们用尽压一压就可以放进箱子里,随身带走,方便又快捷。相同的道理,一个文件夹,如果里面的小文件很多,我们知道计算机在复制的时候,是循环的一个一个复制的,这个文件复制完了,再去复制下一次,文件一多,这样就慢了。所以这个时候我们就会用一定的压缩比例将这个大文件夹压缩成一个文件,这个文件虽然体积大了,但是数量却变成了1个,这样复制传输速度就会快很多。所以在文件下载、传输方面,压缩很有必要。

2.技术

那么压缩到底是怎么做到的呢?为什么,一压缩就会使一个文件的体积变小呢?这要说道计算机的原理。我们知道算机系统中都是使用bytes单位来计量的,其实最小的计量单位应该是bits,1 byte = 8 bits 。但是如果今天我们只是记忆一个数字,比如是 1 这个数字。会如何记录?
假设一个 byte 可以看成底下的模样:□□□□□□□□,所以每个 byte 当中会有 8 个空格,而每个空格可以是 0, 1。所以 1 会在最右边占据 1 个 bit ,而其他的 7 个 bits 将会自动的被填上 0 ,所以1就是 00000001。所以这多出来的空完全可以被压缩掉嘛,这就是压缩的原理。

还有一种压缩呢是计量压缩,比如一个文件里有100个1,按照正常道理会沾满100个bytes的空间,那么这个时候计量压缩会记录成‘100个1’,而不是真的去沾满100个1,你看压缩比就是99%了。其实这和我们目前用到网盘一个道理,360网盘动不动就1个T,N个T的免费空间,这其中也是根据计量压缩的原理,比如,360整个网盘服务器就只会存1部《阿凡达》,不管多少个用户上传,它就存一部。虽然看起来每个用户网盘中都有阿凡达,但是只会存在一部。这也是他们所说的秒传的概念了,就是它去分析你上传的文件的,如果服务器已经存在,就直接加个链接到你的网盘,不需要你上传了。既节约他们的空间,也省了你上传的时间。

二. 几种常见的压缩格式

在Linux中有几种我们使用率比较高的压缩格式:『*.tar, *.tar.gz, *.tar.bz2, *.gz, *.bz2』

*.gz        gzip 程序压缩的文件;
*.bz2       bzip2 程序压缩的文件;
*.tar       tar 程序打包的数据,并没有压缩过;
*.tar.gz    tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2   tar 程序打包的文件,其中并且经过 bzip2 的压缩

1.gzip, zcat


gzip 压缩过的文件后缀是*.gz。

功能描述:压缩命令(只能压缩单个的文件,不能压缩文件夹)

所在路径:all user 所有用户

语法格式:  gzip -1  表示快速压缩

           gzip -9 nine (nice谐音)表示最佳压缩。

注意:压缩后的文件会替换掉源文件(源文件会删掉)

解压缩用:gunzip file.gz 或者用 gzip -d file.gz

[root@localhost ~]# gzip -9 12.php 34.php >==同时压缩两个文件。
[root@localhost ~]# ll
总用量 120
-rw-r--r--  1 root root    31 8月  19 22:57 12.php.gz
-rw-rw-r--  1 root root    27 8月  19 22:43 34.php.gz

zcat 查看一个经过gzip压缩过的压缩包里的文件的内容:

[root@localhost ~]# zcat 12.php.gz
123

2. bzip2, bzcat


bzip压缩过的后缀名是*.bz2

bzip2是gzip的升级版,做到更好的压缩,所以用法一样的,也是只能压缩单个文件

语法格式:  bzip2 -1  表示快速压缩

           bzip2 -9 nine (nice谐音)表示最佳压缩。

           bzip2 -k 12.php >== 压缩时,保留源文件不删除,这个较gzip要实在。

              bzip2 -d 12.php.bz2 解压缩。

[root@localhost ~]# bzip2 -9 -k 12.php >==以最好的压缩比例压缩12.php文件,并且保留12.php源文件
[root@localhost ~]# ll
总用量 120
-rw-r--r--  1 root root     4 8月  19 22:57 12.php >==源文件在,没被替换
-rw-r--r--  1 root root    42 8月  19 22:57 12.php.bz2

[root@localhost ~]# bzip2 -d 12.php.bz2
bzip2: Output file 12.php already exists. >==因为使用了 -k 参数,所以解压时,会提示已经存在

bzcat 查看一个经过bzip2压缩过的压缩包里的文件的内容:
[root@localhost ~]# bzcat 12.php.bz2
123

3. tar

终于要说tar这个命令了。这可是个神奇的命令啊。我们经常会见到ubuntu.tar.gz 这样的文件的命名方式,这个里面就有tar。那么到底tar是干嘛的呢?

功能描述:打包命令,将多个文件,或者多个文件夹,打包成一个包文件,不压缩。

语法格式: tar -c 产生一个.tar文件

           tar -v 观看打包过程

           tar -f 指定打包后的文件名。也可以连起来写: tar -cvf

           tar -x 解打包一个.tar包

注意:这个命令比较奇怪,可以不用加-,直接 tar c、tar v 、tar f。

tar cvf mydir.tar  mydir  >==把文mydir件夹打包成mydir.tar的包(注意前后位置)
tar xvf mydir.tar >==解压回来。

[root@localhost ~]# tar cvf mydir.yangyi mydir bb >==将2个文件夹mydir和bb打包成mydir.yangyi 文件(注意:后台随意取,一般为了证明是用tar命名打包的,我们一样命名成mydir.tar)
mydir/
mydir/333.php
bb/
[root@localhost ~]#

[root@localhost ~]# tar xvf mydir.yangyi >==将mydir.yangyi 解打包回来,会自动覆盖原来的文件,且不会提示。
mydir/
mydir/333.php
bb/


把文件夹打包成mydir.tar的包,这个包很大,它只是把文件夹的内容合成一个包,并没有压缩,所以还需要用g前面讲的 zip - 9命令或者bzip2 -9 进行压缩。

压缩:

[root@localhost ~]# gzip -9 mydir.tar
[root@localhost ~]# ll
总用量 1
-rw-r--r--  1 root root    356 9月   8 21:57 mydir.tar.gz

bzip2压缩也一样。就不再说明了。

解压:
[root@localhost ~]# gzip -d mydir.tar.gz  >==先解压成mydir.tar 文件
[root@localhost ~]# tar xvf mydir.tar >==然后再用tar 解包成mydir文件夹。
mydir/
mydir/333.php
[root@localhost ~]# ll
drwxr-xr-x  2 root root   4096 9月   8 21:56 mydir >==回来了
-rw-r--r--  1 root root 215040 9月   8 21:57 mydir.tar

4. 打包,压缩一次搞定


看了上面的过程震惊了吧,太麻烦了。压缩一个文件夹要先打包再压缩,解压也一样,要先解压缩再解包。麻烦死了,就不能一步搞定?

有!

其实tar 命令还有2个参数:
tar -j //打包的时候,顺便用bzip2给它压缩了
tar -z //打包的时候,顺便用gzip给它压缩了

你看,多爽啊。多快啊。

所以,gzip压缩一个文件或者文件夹:tar zcvf **.tar.gz **
[root@localhost ~]# tar zcvf mydir.tar.gz mydir
[root@localhost mydir]# ll
总用量 8
drwxr-xr-x 2 root root 4096 9月   8 22:24 mydir
-rw-r--r-- 1 root root  363 9月   8 22:26 mydir.tar.gz

解压缩一样 使用 -x :
[root@localhost ~]# tar zxvf mydir.tar.gz >==解压
mydir/
mydir/333.php
[root@localhost ~]# ll
总用量 8
drwxr-xr-x 2 root root 4096 9月   8 22:24 mydir
-rw-r--r-- 1 root root  363 9月   8 22:26 mydir.tar.gz >==注意:使用这种方式不会删除点压缩包,而使用gzip - d + tar xvf .gz文件是会删掉的。

那么使用bzpi2 就用 -j 参数啦:

[root@localhost ~]# tar jcvf mydir.tar.bz2 mydir >==使用bzip压缩
[root@localhost ~]# tar jxvf mydir.tar.bz2 >==解压


5 .解压缩几个比较方便的用法


解压到指定的目录 -C
[root@localhost ~]# tar jxvf mydir.tar.bz2 -C /home/yangyi/ >== -C(大写),这个参数是指定解压到哪个目录,而不是默认的解压到当前目录

只解压指定的文件
[root@localhost mydir]# tar zxvf mydir.tar.gz mydir/22.php >==只想解压出22.php文件。注意z路径是mydir/22.php。而不是22.php。要加上文件夹名字




原创粉丝点击