文件压缩/打包/备份

[TOC]

压缩文件的技术

压缩文件简单原理:目前我们使用的计算机系统中都是使用所谓的 Bytes 单位来计量的!不过,事实上,计算机最小的计量单位应该是 bits 才对啊。此外,我们也知道 1 Byte = 8 bits 。但是如果今天我们只是记忆一个数字,亦即是 1 这个数字呢?由于我们记录数字是 1 ,考虑计算机所谓的二进制喔,如此一来, 1 会在最右边占据 1 个 bit ,而其他的 7 个 bits 将会自动的被填上 0 啰!你看看,其实在这样的例子中,那 7 个 bits 应该是“空的”才对!不过,为了要满足目前我们的操作系统数据的存取,所以就会将该数据转为 Byte 的型态来记录了!而一些聪明的计算机工程师就利用一些复杂的计算方式, 将这些没有使用到的空间“丢”出来,以让文件占用的空间变小!这就是压缩的技术啦!

另外一种压缩技术也很有趣,他是将重复的数据进行统计记录的。举例来说,如果你的数据为“111….”共有100个1时, 那么压缩技术会记录为“100个1”而不是真的有100个1的位存在!
简单的说,你可以将他想成,其实文件里面有相当多的“空间”存在,并不是完全填满的, 而“压缩”的技术就是将这些“空间”填满,以让整个文件占用的容量下降! 不过,这些“压缩过的文件”并无法直接被我们的操作系统所使用的,因此, 若要使用这些被压缩过的文件数据,则必须将他“还原”回来未压缩前的模样, 那就是所谓的“解压缩

常见的压缩指令

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

  • gzip, zcat/zmore/zless/zgrep
    gzip是目前应用最广的压缩指令,后缀为*.gz
    如果压缩的文件是文本文件,压缩后可以使用zcat相关指令读取出来.
1
2
3
4
5
6
7
[dmtsai@study ~]$ gzip [-cdtv#] 文件名
选项与参数:
-c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :#为数字的意思,代表压缩等级,-1最快,但是压缩比最差、-9最慢,但是压缩比最好!默认是 -6

gzip压缩默认会删除原文件,如果想保留原文件可以使用如下命令:

1
2
[dmtsai@study tmp]$ gzip -9 -c services > services.gz
-c 选项打印出文件到屏幕,然后使用 > 重定向

找出压缩文件中的关键字命令:

1
2
3
4
5
[dmtsai@study tmp]$ zgrep -n 'http' services.gz
14:# http://www.iana.org/assignments/port-numbers
89:http 80/tcp www www-http # WorldWideWeb HTTP
90:http 80/udp www www-http # HyperText Transfer Protocol
.....(下面省略).....
  • bzip2, bzcat/bzmore/bzless/bzgrep
    与gzip用法类似,比gzip压缩比更好
    后缀为*.bz2
1
2
3
4
5
6
7
8
[dmtsai@study ~]$ bzip2 [-cdkzv#] 文件名
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留原始文件,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
  • xz, xzcat/xzmore/xzless/xzgrep
    与gzip,bzip2用法类似,比bzip2压缩比更好
    后缀为*.xz
1
2
3
4
5
6
7
8
[dmtsai@study ~]$ xz [-dtlkc#] 文件名
选项与参数:
-d :就是解压缩啊!
-t :测试压缩文件的完整性,看有没有错误
-l :列出压缩文件的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!”

打包文件

虽然 gzip, bzip2, xz 也能够针对目录来进行压缩,不过, 这两个指令对目录的压缩指的是“将目录内的所有文件 “分别” 进行压缩”的动作!而不像在 Windows 的系统,可以使用类似 WinRAR 这一类的压缩软件来将好多数据“包成一个文件”的样式。

tar命令常用选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[dmtsai@study ~]$ tar [-z|-j|-J][cv][-f 待创建的新文件名] filename... <==打包与压缩
[dmtsai@study ~]$ tar [-z|-j|-J][tv] [-f 既有的 tar文件名] <==察看文件名
[dmtsai@study ~]$ tar [-z|-j|-J] [xv] [-f 既有的 tar文件名][-C 目录] <==解压缩
选项与参数:
-c :创建打包文件,可搭配 -v 来察看过程中被打包的文件名(filename)
-t :察看打包文件的内容含有哪些文件名,重点在察看“文件名”就是了;
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
特别留意的是, -c, -t, -x 不可同时出现在一串命令行中。
-z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz
-j :通过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2
-J :通过 xz 的支持进行压缩/解压缩:此时文件名最好为 *.tar.xz
特别留意, -z, -j, -J 不可以同时出现在一串命令行中
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
-f filename:-f 后面要立刻接要被处理的文件名!建议 -f 单独写一个选项啰!(比较不会忘记)
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

其他后续练习会使用到的选项介绍:
-p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!

tar备份

1
2
3
4
5
6
7
8
9
[dmtsai@study ~]$ su -  # 因为备份 /etc 需要 root 的权限,否则会出现一堆错误
[root@study ~]# time tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names <==注意这个警告讯息
/etc/
....(中间省略)....
/etc/hostname

#多了time会显示程序运行时间
#加上"-p"选项原因是为了保存原本文件的权限和属性

tar备份默认是没有根目录的,那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来使用, 在 tar 所记录的文件名 (就是我们刚刚使用 tar -jtvf 所察看到的文件名) 那就是解压缩后的实际文件名。 如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的文件名就会变成“/tmp/etc/xxx”。 但“如果没有拿掉根目录,解压缩后的文件名就会是绝对路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!”如此一来,你的原本的 /etc/ 下面的数据, 就会被备份数据所覆盖过去了!如果想保存根目录可以使用-P选项

解压tar包内单一文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 先找到我们要的文件名,假设解开 shadow 文件好了:
[root@study ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root 721 2015-06-17 00:20 etc/gshadow
---------- root/root 1183 2015-06-17 00:20 etc/shadow-
---------- root/root 1210 2015-06-17 00:20 etc/shadow <==这是我们要的!
---------- root/root 707 2015-06-17 00:20 etc/gshadow-
# 先搜寻重要的文件名!其中那个 grep 是“撷取”关键字的功能!我们会在第三篇说明!
# 这里您先有个概念即可!那个管线 | 配合 grep 可以撷取关键字的意思!

# 2. 将该文件解开!语法与实际作法如下:
[root@study ~]# tar -jxv -f 打包档.tar.bz2 待解开文件名
[root@study ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@study ~]# ll etc
total 4
----------. 1 root root 1210 Jun 17 00:20 shadow
# 很有趣!此时只会解开一个文件而已!不过,重点是那个文件名!你要找到正确的文件名。
# 在本例中,你不能写成 /etc/shadow !因为记录在 etc.tar.bz2 内的并没有 / 之故!

tarfile与tarball

使用tar打包的文件称为tarfile
如果打包文件同时使用压缩则称为tarball.