首先,我们的电脑都是以字节为单位进行计量(最小计量单位为bit)。假设我们要存储数字“1”,那么计算机会存储为“00000001”,压缩就是把这些没有用到的存储空间“丢掉”。
若要使用这些被压缩过的文件数据,就必须把他还原成为压缩时的模样,这就是所谓的解压缩
压缩比: 压缩后与压缩的文件所占用的磁盘空间的大小之比。比如压缩之前文件大小为10MB,压缩后大小为2MB,那么其压缩比为(10-2)/10=80%,因此压缩比越接近于1越好。
很多www网站就是利用文件压缩技术来进行数据的传输,好让网站带宽的利用率上升。
压缩文件的扩展名大多是:*.tar , *.tar.gz, *.tgz, *.gz, *.Z, *bz2, *.xz等。
那么问题来了,不是说Linux的扩展名没啥用吗?哦,原来Linux对应的压缩命令非常多,彼此之间可能无法互通压缩/解压缩,所以就得用这些扩展名区分开,以来帮助电脑前面的观众朋友进行区分。以下是常见的扩展名:
*.Z compres程序压缩的文件
*.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。tar其实是打包软件,并没有提供压缩功能。就像windows中压缩前需要把被压缩的所有文件全部放在一个文件夹中。
gzip可以说是应用最广的压缩命令了,目前gzip可以揭开compress、zip与gzip等软件所压缩的文件,gzip所创建的压缩文件为*.gz,其语法为:
gzip [-cdtv#] 文件名 #压缩
zcat 文件名.gz #查看文本内容
选项与参数:
-c : 将压缩的数据输出到屏幕上,可通过数据流重定向来处理
-d : 解压缩的参数 #解压缩
-t : 检验一个压缩文件的一致性,看文件是否有误
-v : 可以显示压缩比等信息
-# : #为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但压缩比好,默认是-6
看书的时候,我最开始很好奇他为啥用负数表示,哈哈,然后发现“-”只是一个符号,其实还是用的1-9来表示的。
采用gzip压缩会默认删除源文件,若不想采用采用源文件见下例:
eg1:将/etc下面文件中services文件复制到/tmp下,并才以保留源文件的方式用最佳压缩比压缩
cp /etc/services /tmp #复制文件
cd /tmp
gzip -9 -c services > services.gz #进行压缩
gzip -d ./service* #解压缩
等级9是最大的压缩比,不过一般使用默认的6。关键是后面的-c 与 > ,-c可以将原本要转成压缩文件的数据内容,将它变成文字类型从屏幕输出,然后>这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够建立出压缩文件了。只是文件名要自己写,所以还是要遵循gzip的压缩文件名要求为佳。
cat/more/less可以使用不同的方式来读取纯文本文件,而zcat/zmore/zless可以读取纯文本文件被压缩后的压缩文件。找关键词的话,也可以使用zgrep来查找。
bzip2为了替换gzip以提供最佳的压缩比。用法几乎与gzip相同。详见下:
bzip2 [-cdkzv#] 文件名
bzcat 文件名.bz2 #查看压缩文件的内容,不过只能是文本文件
选项与参数:
-c : 将压缩的过程产生的数据输出到屏幕上
-d : 解压缩的参数
-k : 保留原始文件,而不会删除原始文件
-z : 压缩的参数,一般选择默认,不加
-v : 可以显示源文件/压缩文件的压缩比等信息;
-# : 与gzip同样,都是计算压缩比的参数,9最佳,1最快
eg2:将上例留下来的/tmp/services 文件以bzip2压缩
bzip2 -v /tmp/services #就是这么简单,甚至连参数都不用加
bzip2 -d /tmp/ser* #解压缩
但是他能不能嵌套压缩,我压缩你,你压缩我,于是我试了对生成的bz2文件进行gzip压缩,我去,还真的可以,不过压缩比低的可怜,只有0.1%, 算了,还是膨胀回来吧。
wei@wei:/tmp$ gzip -v ./ser*
./services.bz2: -0.1% -- replaced with ./services.bz2.gz
虽然bzip2已经很好了,可还是有好多人不满足,于是就有了xz,具有个更更好的压缩比,用户也几乎与gzip/bzip2相同,我们来瞅瞅她的用法:
xz [-dtlkc#] 文件名
xcat 文件名.xz
选项与参数:
-d : 解压缩
-t : 测试文件的完整性,看看是否有错误
-l : 列出压缩文件的相关信息
-k : 保留原本的文件不删除
-c : 同样的,把数据输出在屏幕上
-# : 同样的,最佳压缩比
不过,压缩比好是好,但是它慢。以鸟哥举的栗子看,gz、bz2、xz去压缩services文件分别使用了:0.019s、0.042s、0.261s,具体使用哪个压缩命令,还是大家自己权衡。
tar可以将多个目录或文件打包成一个大文件,同时还可以通过gzip,bzip2,xz对该文件进行压缩。而且Windows也支持.tar.gz文件名的解压缩。下面列几个比较常用的命令参数:
tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename... #打包与压缩
tar [-z|-j|-J] [tv] [-f 既有的tar文件名] #查看文件名
tar [-z|-j|-J] [xv] [-f 既有的tar文件名] [-C 目录] #解压缩
命令与参数:
-c : 建立打包文件,可搭配-v来查看过程中被打包的文件名
-t : 查看打包文件的内容含有那些文件名,重点在产看【文件名】
-x : 解包或解压缩的功能,可以搭配-C在特定目录解压,-c,-v.-x不可同时出现
-z : 通过gzip进行压缩/解压缩:此时文件名最好为*.tar.gz
-j : 通过bzip2进行压缩/解压缩:此时文件名最好为*.tar.bz2
-J : 通过xz进行压缩/解压缩:此时文件名最好为*.tar.xz -z,-j,-J不可同时出现
-v : 在压缩/解压缩过程中,将正在处理的文件名显示出来
-f filename : -f后面要立刻接要被处理的文件名 建议-f单独写一个选型
-C 目录 : 解压缩在特定目录
-p : 保留备份数据的原本权限与属性,常用于备份重要的配置文件
-P : 保留绝对路径,即允许备份数据中含有根目录存在
--exclude=FILE
看着挺复杂,其实也挺复杂,哈哈,假的。其实简单用的话就下面三条命令:
鸟哥说有事没事备份一下/etc这个目录是件好事,虽然我这种级别还不太理解,不过我们先来试试用tar来备份/etc`
#要在root权限下进行
root@wei:~# time tar -jpcv -f /root/etc.tar.bz2 /etc #time是为了显示程序运行的时间
tar: 从成员名中删除开头的“/” <==警告信息
....... #省略显示信息
root@wei:~# tar -jtv -f /root/etc.tar.bz2 #查看文件的数据内容
现在说一下为什么去掉开头的“/”:
主要是为了安全。比如说解压缩时,如果保留了“/”,就变成了绝对路径,那么解压后的文件/etc/xxx就会自动放置到根目录“/”下去,这样一来,原本/etc/下面的数据,就会被备份数据所覆盖。所以就去掉了开头的“/”,解压后就放在/tmp下(如果在/tmp下解压的话)。
不过,如果你就是要解压到根目录下,就可以加上-P这个选项了。
压缩完了,现在进行解压缩:
tar -jxv -f /root/etc.tar.bz2 #解压到当前工作目录下
若要指定目录解压,可以使用-C命令:
tar -jxv -f /root/etc.tar.bz2 -C /tmp #哦了
举个例子,比如说要解开etc.tar.bz2中的“shadow”文件
root@wei:~# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
-rw-r----- root/shadow 859 2019-11-27 19:11 etc/gshadow
-rw-r----- root/shadow 1381 2019-11-27 19:11 etc/shadow <=需要解压的文件
-rw-r----- root/shadow 839 2019-11-27 19:11 etc/gshadow-
-rw-r----- root/shadow 1381 2019-11-27 19:11 etc/shadow-
root@wei:~# tar -jxv -f /root/etc.tar.bz2 etc/shadow <=解开这个文件
etc/shadow
比如我们想要打包/etc/ /root这几个重要的目录,但却不想要打包/root/etc*开头的文件,我们就可以找–exclude来帮忙。exclude:来啦来啦,催啥!
tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \ <=换行输入
> --exclude=/root/system.tar.bz2 /etc /root
我们要用到–newer-mtime选项
1.找到比/etc/passwd还要新的文件以及他的日期
find /etc -newer /etc/passwd
root@wei:~# ll /etc/passwd
-rw-r--r-- 1 root root 2648 11月 27 19:11 /etc/passwd
2.进行打包
root@wei:~# tar -jcv -f /root/etc.newer.than.passwd.tar.bz2 \
> --newer-mtime="2019/11/27" /etc/* <= 以上面看到的时间为准
然后就完成了,比如说我上个月备份了完整的数据,这个月我就只用备份比上次备份时间新的内容就行了,就不用全部备份了。
另外,tar命令既可以打包压缩,也可以只打包。我们仅打包的文件【tar -cv -f file.tar】的文件成为tarfile;如果还亚索,哦不,压缩的支持,我们就称呼为哈萨给,哈哈哈,跑题了。如果打包了也压缩了。我们称呼他为tarball。见到他知道是什么就可以了。
dd命令主要用于制作一个文件以及备份。因为dd可以读取磁盘设备的内容,然后将整个设备备份成一个文件。下面是一些比较简单的用法:
dd if="input_file" of="output_file" bs="block_size" count="number"
选项与参数:
if : 就是input file,也可以是设备
of : 就是output file,也可以是设备
bs : 设置一个bolck大小,未指定的话是512k=Bytes(一个扇区大小)
count : 多少个bs的意思
eg3:将/etc/passwd备份到/tmp/passwd.back中
root@wei:~# dd if=/etc/passwd of=/tmp/passwd.back
记录了5+1 的读入 #表示有5个完整的512Bytes
记录了5+1 的写出
2648 bytes (2.6 kB, 2.6 KiB) copied, 0.000384544 s, 6.9 MB/s