Linux学习笔记-文件压缩与解压缩

背景:文件压缩技术

首先,我们的电脑都是以字节为单位进行计量(最小计量单位为bit)。假设我们要存储数字“1”,那么计算机会存储为“00000001”,压缩就是把这些没有用到的存储空间“丢掉”。
若要使用这些被压缩过的文件数据,就必须把他还原成为压缩时的模样,这就是所谓的解压缩
压缩比: 压缩后与压缩的文件所占用的磁盘空间的大小之比。比如压缩之前文件大小为10MB,压缩后大小为2MB,那么其压缩比为(10-2)/10=80%,因此压缩比越接近于1越好。
很多www网站就是利用文件压缩技术来进行数据的传输,好让网站带宽的利用率上升。

1.压缩命令

压缩文件的扩展名大多是:*.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中压缩前需要把被压缩的所有文件全部放在一个文件夹中。

1.1 gzip命令

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来查找。

1.2 bzip2命令

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

1.3 xz命令

虽然bzip2已经很好了,可还是有好多人不满足,于是就有了xz,具有个更更好的压缩比,用户也几乎与gzip/bzip2相同,我们来瞅瞅她的用法:

xz [-dtlkc#] 文件名
xcat 文件名.xz
选项与参数:
-d : 解压缩
-t : 测试文件的完整性,看看是否有错误
-l : 列出压缩文件的相关信息
-k : 保留原本的文件不删除
-c : 同样的,把数据输出在屏幕上
-# : 同样的,最佳压缩比

不过,压缩比好是好,但是它慢。以鸟哥举的栗子看,gz、bz2、xz去压缩services文件分别使用了:0.019s、0.042s、0.261s,具体使用哪个压缩命令,还是大家自己权衡。

2.打包命令:tar

tar可以将多个目录或文件打包成一个大文件,同时还可以通过gzip,bzip2,xz对该文件进行压缩。而且Windows也支持.tar.gz文件名的解压缩。下面列几个比较常用的命令参数:

2.1tar的基本用法

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

看着挺复杂,其实也挺复杂,哈哈,假的。其实简单用的话就下面三条命令:

  • 压缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
  • 查询:tar -jtv -f filename.bz2
  • 解压缩:tar -jxv -f filename.tar.bz2 -C 想要解压缩的目录

鸟哥说有事没事备份一下/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   #哦了

2.2 特殊用法

  • 解开单一文件

举个例子,比如说要解开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。见到他知道是什么就可以了。

3.其他常用备份工具

dd

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值