一、文件与文件系统的打包与压缩
压缩技术的原理:我们知道计算机中存储的单位最小的是bit,而我们常用的是byte,而1byte=8bit。那么当我们存储一个数字1时,计算机会以字节的形式存储,那么用二进制表示00000001,我们发现0不起任何作用,那么压缩技术就是把这些没有用到的空间利用起来。
注意:压缩的后的文件是无法被操作系统直接使用的,需要解压缩
**压缩比:压缩前与压缩后的文件所占
.gz gzip程序压缩的文件
.bz2 bzip2程序压缩的文件
.tar tar程序打包的数据,并没有被压缩过
.tar,gz tar程序打包后的文件,经过gzip的压缩
.tar.bz2 tar程序打包后的文件,经过bzip2程序的压缩
tar程序仅仅是将很多文件打包成一个文件,本来没有压缩的功能,后来在GNU计划中加入了压缩的功能。
- gzip和zcat
注意:可以解压zip,compress,gzip压缩过的文件,也可以使用gzip压缩文件,在windows中可以用winrar解压。使用cat可以读取纯文本文件,而使用zcat可以读取纯文本文件压缩后的文件。
gzip +(-cdtv#) 文件名
zcat 文件名.gz
使用gzip 加文件名默认直接压缩成文件名.gz格式。
[root@localhost tmp]# ls
1 cq nn.gz
使用gzip -d 文件名.gz,解压文件
[root@localhost tmp]# ls
1 cq nn
[root@localhost tmp]# gzip nn
[root@localhost tmp]# ls
1 cq nn.gz
[root@localhost tmp]# gzip -d nn.gz
[root@localhost tmp]# ls
1 cq nn
使用gzip -v 文件名,显示压缩比并且压缩文件生成文件名.gz
[root@localhost tmp]# gzip -v nn
nn: 61.9% -- replaced with nn.gz
[root@localhost tmp]# ls
1 cq nn.gz
使用zcat +文件名.gz,查看已经压缩的文件。
[root@localhost tmp]# zcat nn.gz
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
gzip + -num(1-9) -c 文件名 > 文件名.gz
用指定的压缩比压缩文件并且保留原来的文件。-c表示将压缩的数据输出到屏幕。
1-9为压缩的等级,1是最快的压缩方式,而9是最佳的压缩方式。
[root@localhost tmp]# ls
1 cq nn.gz
[root@localhost tmp]# gzip -9 -c cq > cq.gz
[root@localhost tmp]# ls
1 cq cq.gz nn.gz
也可以使用gunzip +文件名.gz解压文件
- bzip2和bzcat
注意:bzip2是比gzip更强的压缩工具,他提供了更好的压缩比
bzip2 + -z 文件名 表示压缩一个文件
bzip2 + -d 文件名.bz2 表示解压一个文件
[root@localhost tmp]# ls
passwd
[root@localhost tmp]# bzip2 -z passwd
[root@localhost tmp]# ls
passwd.bz2
[root@localhost tmp]# bzip2 -d passwd.bz2
[root@localhost tmp]# ls
passwd
bzip2 +-k +文件名 表示不删除原文件压缩,保留原文件压缩。
[root@localhost tmp]# bzip2 -k passwd
[root@localhost tmp]# ls
passwd passwd.bz2
使用bzip2 + -9 + -c 文件名 > 文件名.gz
用指定的压缩比压缩并且保留原文件。
[root@localhost tmp]# ls
passwd
[root@localhost tmp]# bzip2 -1 -c passwd > passwd.bz2
[root@localhost tmp]# ls
passwd passwd.bz2
[root@localhost tmp]# du -h passwd.bz2
4.0K passwd.bz2
[root@localhost tmp]# du -h passwd
4.0K passwd
[root@localhost tmp]# bzip2 -9 -c passwd > passwd1.bz2
[root@localhost tmp]# ls
passwd passwd1.bz2 passwd.bz2
[root@localhost tmp]# du -h passwd1.bz2
4.0K passwd1.bz2
使用bzcat+文件名.bz2,查看压缩文件
[root@localhost tmp]# bzcat passwd.bz2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
使用bunzip2 文件名.bz2代替bzip2 -d 文件名.bz2
[root@localhost tmp]# ls
passwd passwd1.bz2 passwd.bz2
[root@localhost tmp]# rm -rf passwd
[root@localhost tmp]# bunzip2 passwd.bz2
[root@localhost tmp]# ls
passwd passwd1.bz2
- tar
前面所介绍的gzip和bzip2都是对单个文件进行压缩,虽然可以对目录进行压缩但是仅仅只是对目录中的各个文件分别进行压缩。
而tar这个命令就是可以将多个文件或者目录打包成一个大的文件,同时还可以通bzip2和gzip的支持,将该文件同时进行压缩。
注意:由于tar使用非常广泛,windows下的winrar也支持对tar.gz文件的解压缩。
首先,需要了解几个重要的参数
[-j | -z] -j表示bzip2的支持,-z表示gzip的支持。
-c,表示打包文件,x表示解压缩。
我们常用tar -zxf 文件名.tar.gz
解压文件,z表示gzip支持,保留原压缩文件进行解压。而使用tar -zxvf ,则会在解压的过程中显示操作的文件名。
使用tar -zxf .tar.gz -C 文件名,解压到指定的地方。
而把z换成j那么就可以用到bzip2支持的文件格式,那么怎样将文件打包压缩成bzip2,gzip支持的文件格式。注意:使用tar打包压缩文件,默认会保留原文件*
[root@localhost tmp]# tar -jcvf cq.bz2 etc/
[root@localhost tmp]# tar -zcvf cq.tar.gz etc/
注意,压缩后文件名为我们自己创造的需要放在原文件名的前面
综上:
几种常用的解压压缩方式
[root@localhost tmp]# tar -jcf cq.bz2 etc/
[root@localhost tmp]# tar -zcf cq.tar.gz etc/
[root@localhost tmp]# tar -zxf cq.tar.gz
[root@localhost tmp]# tar -zxf cq.tar.gz -C /tmp/
[root@localhost tmp]# tar -jxf cq.bz2
查看压缩文件中的文件名,加上-v会显示具体文件的属性和权限,而只有t的话只会显示压缩操作的文件名。
[root@localhost tmp]# tar -jtvf cq.bz2
[root@localhost tmp]# tar -ztvf cq.bz2
保留文件的属性和权限进行备份
tar -zpcvf /root/etc.tar.gz /etc
特别注意:我们在备份一些重要的文件的时候,打包压缩后的文件路径往往不会带根路径,可以观察我们在打包压缩一个目录的时候会有提示
[root@localhost tmp]# tar -jcvf /tmp/cq.bz2 /etc/*
tar: 从成员名中删除开头的“/”
此时,解压生成的文件的路径为当前解压后文件所在的目录。
由于我们备份的文件很有可能会被再次使用,如果没有去掉根目录,那么,解压压缩后的文件会自动变成绝对路径,如此一来,你的当前目录的原文件会备覆盖的。
-P参数会使得压缩的文件不删除根目录。
- dd
dd这个工具可以直接读取磁盘设备的内容,然后将整个设备备份成一个文件.
[root@localhost tmp]# dd if=/etc/passwd of=/tmp/passwd
记录了3+1 的读入
记录了3+1 的写出
2005字节(2.0 kB)已复制,0.000168052 秒,11.9 MB/秒
[root@localhost tmp]# ls
cq.bz2 passwd
备份磁盘的第一块扇区
[root@localhost tmp]# dd if=/dev/vda1 of=/tmp/mbr.back bs=512 Count=1
由于很少使用dd,我们仅仅需要了解dd这个命令可以直接从磁盘上备份。
如果我们想要构建两块一样的磁盘的时候,我们可以从旧的分区将所有数据通过dd复制过来,连同各种块一起复制过来。
dd if=/dev/sda of=/dev/sdb完整的复制一块磁盘