8.1 压缩文件的用途与技术

目前我们使用的计算机系统中都 是使用所谓的 Bytes 单位来计量的!不过,事实上,计算机最小的计量单位应该是 bits 才对

1 Byte = 8 bits

  • 压缩

  • 解压缩

  • 压缩比

8.2 Linux 系统常见的压缩指令

Linux 文件的属性基本上是与文件名没有绝对关系的

为了帮助我们人类小小的脑袋瓜子,所 以适当的扩展名还是必要的

常见的压缩文件扩展名

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

Linux上常见的压缩指令就是 gzip, bzip2 以及最新的 xz ,至于 compress 已经退流行了。为 了支持 windows 常见的 zip,其实 Linux 也早就有 zip 指令了! gzip 是由 GNU 计划所开发出 来的压缩指令,该指令已经取代了 compress 。 后来 GNU 又开发出 bzip2 及 xz 这几个压缩 比更好的压缩指令!不过,这些指令通常仅能针对一个文件来压缩与解压缩,此时“打包软件, tar”就显的很重要

tar 可以将很多文件“打包”成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是“打包”而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的 功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方 便并且更强大的压缩与打包功能

8.2.1 gzip, zcat/zmore/zless/zgrep

gzip 可以说是应用度最广的压缩指令了

gzip 可以解开 compress, zip 与 gzip 等软件所 压缩的文件

gzip 所创建的压缩文件为 *.gz 的文件名

gzip [-cdtv#] 文件名 
zcat 文件名.gz 

选项与参数: 
-c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理; 
-d :解压缩的参数; 
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误; 
-v :可以显示出原文件/压缩文件的压缩比等信息; 
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
# 范例一:找出 /etc 下面 (不含子目录) 容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩
ls -ldSr /etc/*
cd /tmp
cp /etc/services .
gzip -v services
ll /etc/services /tmp/services*

使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的文件名,原始文 件就不再存在了。

使用 gzip 压缩的文件在 Windows 系统中,竟然可以被 WinRAR/7zip 这 个软件解压缩

# 范例二:由于 services 是文本文件,请将范例一的压缩文件的内容读出来
zcat services.gz
# 由于 services 这个原本的文件是是文本文件,因此我们可以尝试使用 zcat/zmore/zless 去读取
# 直接用 less 也可以读取

# 范例三:将范例一的文件解压缩
gzip -d services.gz
#  gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件


# 范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
gzip -9 -c services > services.gz

# 范例五:由范例四再次创建的 services.gz 中,找出 http 这个关键字在哪几行?
zgrep -n 'http' services.gz

通过大于 (>) 这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不 是屏幕

如果你还想要从文字压缩文件当中找数据的话,可以通过 egrep 来搜寻关键字

8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep

若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的

bzip2 的用法几乎与 gzip 相同

bzip2 [-cdkzv#] 文件名 
bzcat 文件名.bz2 

选项与参数: 
-c :将压缩的过程产生的数据输出到屏幕上! 
-d :解压缩的参数 
-k :保留原始文件,而不会删除原始的文件喔! 
-z :压缩的参数 (默认值,可以不加) 
-v :可以显示出原文件/压缩文件的压缩比等信息; 
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
# 范例一:将刚刚 gzip 范例留下来的 /tmp/services 以 bzip2 压缩 
bzip2 -v services 
ls -l services* 
# 此时 services 会变成 services.bz2 之外,你也可以发现 bzip2 的压缩比要较 gzip 好喔!! # 压缩率由 gzip 的 79% 提升到 bzip2 的 81% 哩! 

# 范例二:将范例一的文件内容读出来! 
bzcat services.bz2 

# 范例三:将范例一的文件解压缩 
bzip2 -d services.bz2 

# 范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件 
bzip2 -9 -c services > services.bz2

8.2.3 xz, xzcat/xzmore/xzless/xzgrep

虽然 bzip2 已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推 出了 xz 这个压缩比更高的软件!这个软件的用法也跟 gzip/bzip2 几乎一模一样

xz [-dtlkc#] 文件名 
xcat 文件名.xz 

选项与参数: 
-d :就是解压缩啊! 
-t :测试压缩文件的完整性,看有没有错误 
-l :列出压缩文件的相关信息 
-k :保留原本的文件不删除~ 
-c :同样的,就是将数据由屏幕上输出的意思! 
-# :同样的,也有较佳的压缩比的意思!

通过“ time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz] ”去执行运算 结果,结果发现这三个指令的执行时间依序是: 0.019s, 0.042s, 0.261s

8.3 打包指令: tar

gzip, bzip2, xz 也能够针对目录 来进行压缩,不过, 这两个指令对目录的压缩指的是“将目录内的所有文件 “分别” 进行压 缩”的动作

这种将多个文件或目录包成一个大文件的指令功能,我们可以称呼他是一种“打包指令”啦! 那 Linux 有没有这种打包指令呢?是有的!那就是鼎鼎大名的 tar 这个玩意儿了! tar 可以将 多个目录或文件打包成一个大文件,同时还可以通过 gzip/bzip2/xz 的支持,将该文件同时进 行压缩! 更有趣的是,由于 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 文件名的解压缩呢

8.3.1 tar

tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename...       # 打包与压缩 
tar [-z|-j|-J] [tv] [-f 既有的 tar文件名]       # 察看文件名 
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 就只要记忆下面的方式即可:

  • 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称

  • 查 询:tar -jtv -f filename.tar.bz2

  • 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

filename.tar.bz2 是我们自己取的文件名,tar 并不会主动的产生创建的文件名

不加 [-z|-j|-J] 的话,文件名最好取为 .tar

如果是 -j 选项,代表有 bzip2 的支持,因此文件名最好就取为 .tar.bz2

如果是加上了 -z 的 gzip 的支持,那文件名最好取为 *.tar.gz

由于“ -f filename ”是紧接在一起的,过去很多文章常会写成“-jcvf filename”,这样是对 的, 但由于选项的顺序理论上是可以变换的,所以很多读者会误认为“-jvfc filename”也可以~ 事实上这样会导致产生的文件名变成 c ! 因为 -fc 嘛!所以啰,建议您在学习 tar 时,将“ -f filename ”与其他选项独立出来,会比较不容易发生问题

使用 tar 加入 -z, -j 或 -J 的参数备份 /etc/ 目录

su -
time tar -zpcv -f /root/etc.tar.gz /etc
time tar -jpcv -f /root/etc.tar.bz2 /etc
time tar -Jpcv -f /root/etc.tar.xz /etc
ll -h /root/etc*
du -sh /etc

压缩比越好当然要花费的运算时间越多

查阅 tar 文件的数据内容 (可察看文件名),与备份文件名有否根目录的意义

 tar -jtv -f /root/etc.tar.bz2

从上面的数据我们可以发现一件很有趣的事情,那就是每个文件 名都没了根目录了!这也是上一个练习中出现的那个警告讯息“tar: Removing leading /’ from member names(移除了文件名开头的 /’ )”所告知的情况

那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来 使用, 在 tar 所记录的文件名 (就是我们刚刚使用 tar -jtvf 所察看到的文件名) 那就是解压 缩后的实际文件名。

如果没有拿掉根目录,解压缩后的文件名就会是绝对 路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!如此一来,你的原本的 /etc/ 下面的数据, 就会被备份数据所覆盖过去了!

# 范例:将文件名中的(根)目录也备份下来,并察看一下备份文件的内容文件名
tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
# 查看压缩包内容
tar -jtf /root/etc.and.root.tar.bz2

如果加上 -P 选项,那么文件名内的根目录就会存在

将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)

# 本目录下进行解压缩
tar -jxv -f /root/etc.tar.bz2

# 在指定目录下进行解压缩
tar -jxv -f /root/etc.tar.bz2 -C /tmp

仅解开单一文件的方法

# 1\. 先找到我们要的文件名,假设解开 shadow 文件好了:
tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'

# 2\. 将该文件解开
tar -jxv -f 打包档.tar.bz2 待解开文件名
tar -jxv -f /root/etc.tar.bz2 etc/shadow

打包某目录,但不含该目录下的某些文件之作法

# 打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件
tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root

仅备份比某个时刻还要新的文件

使用 –newer 时,表示后续的日期包含“ mtime 与 ctime ”,而 –newer-mtime 则仅是 mtime

# 1\. 先由 [find](../Text/index.html#find) 找出比 /etc/passwd 还要新的文件
find /etc -newer /etc/passwd

# 2\. 使用 tar 来进行打包!日期为上面看到的 2015/06/17
tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2015/06/17" /etc/*
# 最后行显示的是“没有被备份的”,亦即 not dumped

# 3\. 显示出文件即可
tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$'
# 通过这个指令可以调用出 tar.bz2 内的结尾非 / 的文件名

基本名称: tarfile, tarball ?

tar 打包出来的文件有没有进行压缩所得到文件称呼不同喔! 如果仅是打 包而已,就是“ tar -cv -f file.tar ”而已,这个文件我们称呼为 tarfile 。 如果还有进行压缩的支 持,例如“ tar -jcv -f file.tar.bz2 ”时,我们就称呼为 tarball (tar 球?)

特殊应用:利用管线命令与数据流

# 1\. 将 /etc 整个目录一边打包一边在 /tmp 解开
tar -cvf - /etc | tar -xvf -
# 可以将 - 想成是在内存中的一个设备(缓冲区)

例题:系统备份范例

假设目前你已经知道重要的目录有下面这几个:

  • /etc/ (配置文件)

  • /home/ (使用者的主文件夹)

  • /var/spool/mail/ (系统中,所有帐号的邮件信箱)

  • /var/spool/cron/ (所有帐号的工作排成配置文件)

  • /root (系统管理员的主文件夹)

/home/loop* 不需要备份,而且 /root 下面的压缩文件也不需要备份,另外假设你要将备份的数据放置到 /backups ,并且该目录仅 有 root 有权限进入! 此外,每次备份的文件名都希望不相同,例如使用:backup-system- 20150701.tar.bz2 之类的文件名来处理

# 1\. 先处理要放置备份数据的目录与权限:
mkdir /backups
chmod 700 /backups

# 2\. 假设今天是 2015/07/01 ,则创建备份的方式如下:
tar -jcv -f /backups/backup-system-20150701.tar.bz2 --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* /etc /home /var/spool/mail /var/spool/cron /root

解压缩后的 SELinux 课题

如果因为某些缘故,所以你的系统必须要以备份的数据来回填到原本 的系统中,那么得要特别注意复原后的系统的 SELinux 问题! 尤其是在系统文件上面

8.4 XFS 文件系统的备份与还原

使用 tar 通常是针对目录树系统来进行备份的工作,那么如果想要针对整个文件系统来进行备 份与还原呢?由于 CentOS 7 已经使用 XFS 文件系统作为默认值,所以那个好用的 xfsdump 与 xfsrestore 两个工具对 CentOS 7 来说,就是挺重要的工具软件了。

8.5 光盘写入工具

8.6 其他常见的压缩与备份工具

8.6.1 dd

dd 可以读取磁盘设备的内容(几乎是直接读取扇区”sector”),然后将整个设备备份成一个文 件

dd if="input_file" of="output_file" bs="block_size" count="number" 

选项与参数: 
if :就是 input file 啰~也可以是设备喔! 
of :就是 output file 喔~也可以是设备; 
bs :规划的一个 block 的大小,若未指定则默认是 512 Bytes(一个 sector 的大小) 
count:多少个 bs 的意思。
# 范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
dd if=/etc/passwd of=/tmp/passwd.back

# 范例二:将刚刚烧录的光驱的内容,再次的备份下来成为图像挡
dd if=/dev/sr0 of=/tmp/system.iso

# 范例三:假设你的 USB 是 /dev/sda 好了,请将刚刚范例二的 image 烧录到 USB 磁盘中
dd if=/tmp/system.iso of=/dev/sda

# 范例四:将你的 /boot 整个文件系统通过 dd 备份下来
df -h /boot
dd if=/dev/vda2 of=/tmp/vda2.img

默认 dd 是一个一个扇区去读/写的,而 且即使没有用到的扇区也会被写入备份文件中! 因此这个文件会变得跟原本的磁盘一模一样 大

8.6.2 cpio

cpio 可以备份任何东西,包括设备文件

cpio -ovcB > [file|device] # 备份 
cpio -ivcdu < [file|device] # 还原 
cpio -ivct < [file|device] # 察看 

备份会使用到的选项与参数: 
-o :将数据 copy 输出到文件或设备上 
-B :让默认的 Blocks 可以增加至 5120 Bytes ,默认是 512 Bytes ! 这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念) 

还原会使用到的选项与参数: 
-i :将数据自文件或设备 copy 出来系统当中 
-d :自动创建目录!使用 cpio 所备份的数据内容不见得会在同一层目录中,因此我们 必须要让 cpio 在还原时可以创建新目录,此时就得要 -d 选项的帮助! 
-u :自动的将较新的文件覆盖较旧的文件! 
-t :需配合 -i 选项,可用在"察看"以 cpio 创建的文件或设备的内容 

一些可共享的选项与参数: 
-v :让储存的过程中文件名称可以在屏幕上显示 
-c :一种较新的 portable format 方式储存

原文地址:http://www.cnblogs.com/huangwenjie/p/16870668.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性