一、前言
压缩文件的用途与技术
- 概念:比较大型的文件通过压缩技术可以是其磁盘使用率降低,从而达到降低文件容量的效果。此外,有的压缩程序还可以进行容量限制,使一个大型文件可以划分成为数个小型文件,以方便携带
- 用与好处途:
- 压缩过的文件容量变小,可以降增加磁盘容量的使用率
- 在一些网络数据的传输中,数据量降低可以让网络带宽用来做更多的工作。目前很多www网站也是利用文件压缩的技术来进行数据的传送,从而增加网站带宽的利用率
- 压缩技术
- 第一种:计算机最小的单位为Bibit,1B=8bit。例如我们存储1字节的数据,会使用8bit来存储,如果这个数据没有、占满8个bit,前面的比特位就会用0填充。我们计算机工程师就利用一些复杂的计算方式,将前面这些没有使用比特空间“丢”出去,以让文件占用的空间变小,这就是压缩技术的其中一种
- 另一种:将文件中重复的数据进行统计记录。例如:如果你的数据为[111....]共有100个1时,压缩技术就会记录为100个1,而不是真的有100个1的比特位存在,这样也能够精简文件记录的容量
Linux系统常见的压缩、解压、打包命令
- 命令分类
- 在Linux环境中,压缩文件的扩展名大多是:*.tar、*.tar.gz、*.tgz、*.gz、*.Z、*.bz2、*.xz等等
- 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的压缩 |
- 不同命令的特点、区别
- zip:为了支持Windows的压缩文件,Linux也有zip命令
- compress:这个是个非常老的命令,现在几乎已经不再使用,如果你的系统中还有*.Z的文件,那么可以使用znew将其转变为gzip格式的压缩文件
- gzip:是由GUN计划开发出来替换compress命令的
- bzip2、xz:由GUN计划推展处的更好的压缩命令
- tar:tar命令可以将多个文件打包成一个文件(包括目录),即将很多文件结合成为一个文件。但是单纯的tar命令仅是打包而已,并不提供压缩功能。后来,GUN计划中将tar与压缩功能结合在一起,于是就有了更强大的压缩与打包功能
- 重点:compress、gzip、bzip2、xz等这些命令只能针对一个文件来压缩和解压。如果想要对多个文件就行压缩和解压,就需要使用到tar命令
- 一般情况下,重点:小文件的压缩用gzip,大文件的压缩用bzip2。详情见下图的压缩比
二、gzip命令
- 功能与特点:
- gzip可以解压compress、zip、gzip(.gz)等软件所压缩的文件。gzip对后缀为.gz的压缩文件进行操作
- .gz的压缩文件在Windows下可以被WinRAR或7zip等软件解压
- 压缩文件时:不加任何参数,不保留源文件。使用-k保留源文件
- 解压文件时:使用-d参数解压不保留源压缩文件。使用-kd保留压缩文件
- 格式:gzip [选项] 文件名
命令选项
- 压缩时:
- -k:压缩时单独使用保留源文件
- -#:#代表数字,代表压缩等级(压缩比)。-1最快,但是压缩比最差,-9最慢,但是压缩比最好。默认为-6
- -c:将压缩的数据输出到屏幕上,可通过数据流重定向来处理。下面案例中会与>符号配合使用,注意查看
- 解压时:
- -d:解压文件,不保存源压缩文件
- -k:解压时与-d配合使用(必须配合)保留源压缩文件
- 压缩解压都可用:
- -v:显示原文件/压缩文件的压缩比等信息
- -k
- 单独使用:
- -t:用来检验一下压缩文件的一致性,看看文件有无错误
- -l :列出压缩文件的相关信息(压缩前后的对比等)
压缩案例
- 例如我的目录下有一个services文件
- 压缩文件,显示压缩比,保留源文件:gzip -kv services
- 压缩文件,使用9级压缩,保留源文件:gzip -9k services
- 压缩文件,保留源文件,自己设定压缩文件名称:gzip -c services > services.gz
- -c可以将原本要转成压缩文件的数据内容,将它变成文字类型从屏幕输出,然后我们可以通过大于(>)这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够建立出压缩文件了。后面的压缩文件名是自己规定的,可以自行设定,但必须符合压缩文件名的要求
- 压缩文件,不保留源文件:gzip services
解压案例
- 解压文件,保留源压缩文件,显示压缩比:gzip -dkv services.gz
- 解压文件,不保留源压缩文件:gzip -d services.gz
其它案例
- 查看压缩文件的压缩比等信息:gzip -l services.gz
- 检验一下压缩文件的一致性:gzip -t services.gz
zcat、zmore、zless、zgrep命令
- 提示:命令支持compress、gzip所压缩的文件(*.gz)使用(compress所压缩的文件可以被gzip解压缩,所以也支持)
- zcat、zmore、zless:
- 概念:普通cat、more、less命令可以读取纯文本文件的内容,zcat、zmore、zless则可以读取纯文本文件被压缩后的压缩文件内容
- 注意:不再支持cat、more、less命令中的相关选项参数
- 例如:我们有一个test文件被压缩成一个test2.gz压缩文件。下面读取test.gz的内容:zcat test.gz
- zgrep
- 概念:普通grep可以在文本中查找字符串,zgrep则是在压缩文件中查找字符串,不需要解压就可以操作,十分的方便
- 注意:扔支持grep命令中的相关选项参数
- 例如:将上面的test.gz压缩文件中查找字符串并并显示出在第几行:zgrep -n 'hello' test.gz
三、bzip2命令
- 功能与特点:
- bzip2是为了替换gzip并提供更佳的压缩比,bzip2对后缀为.bz2的压缩文件进行操作
- bzip2的用法与gzip几乎相同
- 解压:用到参数-d或-k
- 压缩:不写任何选项,源文件不会保留。用参数-k压缩时,源文件会保留
- 格式:bzip2 [选项] 文件名
命令选项
- 不支持-l选项
- 压缩时使用:
- -k:压缩时单独使用保留源文件
- -#:#代表数字,代表压缩等级(压缩比)。-1最快,但是压缩比最差,-9最慢,但是压缩比最好。默认为-6
- -c:将压缩的数据输出到屏幕上,可通过数据流重定向来处理。在上面gzip有介绍
- 解压时使用:
- -d:将压缩文件进行解压,不保存源压缩文件
- -k:解压时与-d配合使用(必须配合)保留源压缩文件
- 压缩解压都可用:
- -v:显示原文件/压缩文件的压缩比等信息
压缩案例
- 压缩文件,显示压缩比,保留源文件:bzip2 -kv services
- 压缩文件,使用9级压缩,保留源文件:bzip2 -9k services
- 压缩文件,保留源文件,自己设定压缩文件名称:bzip2 -c services > services.bz2
- 压缩文件,不保留源文件:bzip2 services
解压案例
- 解压文件,保留源压缩文件,显示压缩比:bzip2 -dkv services.bz2
- 解压文件,不保留源压缩文件:bzip2 -d services.bz2
bzcat、bzmore、bzless、bzgrep命令
- 原理和用法与zcat、zmore、zless、zgrep命令相同
- 这些命令只针对于bzip2所压缩的文件(*.bz2)所使用
四、xz命令
- 功能与特点:
- 虽然bzip2已经是很好用的软件了,但是为了满足软件开发者的需要,又推出了xz这个压缩比更高的软件(但是时间花费更久)。xz对后缀为.xz的压缩文件进行操作
- xz的用法与bzip2几乎相同
- 解压:用到参数-d或-k
- 压缩:不写任何选项,源文件不会保留。用参数-k压缩时,源文件会保留
- 格式:xz [选项] 文件名
命令选项
- 压缩时使用:
- -k:压缩时单独使用保留源文件
- -#:#代表数字,代表压缩等级(压缩比)。-1最快,但是压缩比最差,-9最慢,但是压缩比最好。默认为-6
- -c:将压缩的数据输出到屏幕上,可通过数据流重定向来处理。在上面gzip有介绍
- 解压时使用:
- -d:将压缩文件进行解压,不保存源压缩文件
- -k:解压时与-d配合使用(必须配合)保留源压缩文件
- 压缩解压都可用:
- -v:显示原文件/压缩文件的压缩比等信息
- 单独使用:
- -t:测试压缩文件的完整性,看看有没有错误
- -l :列出压缩文件的相关信息(压缩前后的对比等)
压缩案例
- 压缩文件,显示压缩比,保留源文件:xz -kv services
- 压缩文件,使用9级压缩,保留源文件:xz -9k services
- 压缩文件,保留源文件,自己设定压缩文件名称:xz -c services > services.xz
- 压缩文件,不保留源文件:xz services
解压案例
- 解压文件,保留源压缩文件,显示压缩比:xz -dkv services.xz
- 解压文件,不保留源压缩文件:xz -d services.xz
其它案例
- 查看压缩文件的压缩比等信息:xz -l services.xz
- 检验一下压缩文件的一致性:xz -t services.xz
xzcat、xzmore、zxless、xzgrep命令
- 原理和用法与zcat、zmore、zless、zgrep命令相同
- 这些命令只针对于xz所压缩的文件(.xz)所使用
五、tar
- 功能与特点:
- tar可以将多个文件/目录打包成为一个大文件的功能
- tar默认仅提供打包功能,不提供压缩功能
- tar可以和gzip、bzip2、xz结合,将打包后的大文件进行压缩
- 目前Windows的WinRAR支持.tar.gz文件名的解压缩
- 格式
- 打包与压缩:tar [-z/-j/-J] [-cv] [-f 打包/压缩之后的文件名(自己手写)] 要被打包/压缩的文件名
- 解压缩:tar [-z/-j/-J] [-xv] [-f 现在的tar文件名] [-C 目录] [指定要解压的文件]
- 查看文件名:tar [-z/-j/-J] [-tv] [-f 现有的tar文件名]
命令选项
- -c:建立打包文件,可以搭配-v查看打包过程中的文件名
- -x:解包/解压的功能,可以搭配-C在特定目录下解压
- -t:查看打包文件的内容包含哪些文件名
- -v:在压缩/解压的过程中,将正在处理的文件名显示出来
- -f:表示文件,后面接要被处理的文件名。建议-f单独拿出来写
- -C:解压时,解压到指定目录下,后面跟目录名
- -p:打包/压缩时,保留数据的原本属性与权限,常用于备份(-c)重要的配置文件
- -P:打包/压缩时,保留绝对路径,文件数据名保留根目录/
- -z:使用gzip方式处理,与"c"结合表示压缩,与"x"结合表示解压。处理的文件名后缀为*.tar.gz
- -j:使用bzip2方式处理,与"c"结合表示压缩,与"x"结合表示解压。处理的文件名后缀为*.tar.bz2
- -J:使用xz方式处理,与"c"结合表示压缩,与"x"结合表示解压。处理的文件名后缀为*.tar.xz
- --exclude=文件名:在压缩/打包的过程中,不要将指定文件打包
- --newer="日期":只压缩/打包比后面日期还要新的文件/目录。后面的时期包含mtime和ctime
- --newer-mtime="日期":只压缩/打包比后面日期还要新的文件/目录。后面的日期仅是mtime
- 注意:
- 以不同的方式处理,文件的后缀名不同
- c、x、t不可以出现在同一串命令中。z、j、J不可以出现在同一串命令中
基本术语:tarfile、tarball
- tarfile:如果我们对文件只是进行简单的打包,并没有压缩,那么打包后的文件就称为tarfile(例如:tar -cv -f file.tar file)
- tarball:如果我们对文件进行打包,又进行压缩。那么打包压缩后的文件就称为tarball(例如:tar -jcv -f file.tar.bz2 file)
压缩文件并查看压缩文件的内容
- 下面我们将/etc这个重要目录备份到/root/目录下,因为/etc十分重要,所以使用root权限,否则会出现很多错误
- 第一步:压缩文件
- 备注:使用gzip方式压缩,所以使用-z。为了保存文件的原始属性与权限,所以使用-p
tar -zpcv -f /root/etc.tar.gz /etc
- 注意:压缩之后,信息第一行会出现一个移除/目录的提示,这个原因会在下面的-P选项时讲到
- 第二步:查看tar文件的数据内容
- 备注:-v会将文件的属性/权限等详细信息显示出来。如果只是想单纯的查看文件名,只需要-t就行
tar -ztv -f /root/etc.tar.gz
压缩/打包时-P参数的有无的重要性
- ①不使用-P参数压缩:从上面压缩事例我们可以看出,我们查看tar文件的数据内容时,文件的路径名前面根目录'/'被去除了。这是为什么哪?
- 我们在压缩时,如果不加参数-P,压缩后的文件名前面会去除掉根目录/,所以会移除根目录的提示
- 为什么要这么设计?主要是为了安全。如果这个压缩文件被解压后,假设在/tmp目录下解压,所以解压后,文件名就变为/tmp/etc/xxx。但是如果没有去掉根目录的话,解压后,就会被解压到原来的目录下,即/etc/xxx,那么这样解压之后就会覆盖原来目录下的内容,后果不堪设想
- ②使用-P参数压缩:保留绝对路径,亦即允许备份数据中含有根目录存在之意
- 例如将根目录的也备份下来,并查看文件的内容数据
tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
tar -jtf /root/etc.and.root.tar.bz2
- 可以看出,使用-P后,文件名包含了根目录。但是不建议使用此参数
打包/压缩时指定不打包某些目录,--exclude选项的使用
- 何时使用:假设我们打包一个目录,但是不想要其中的某些文件,就可以使用到--exclude这个选项
演示案例:
- 第一步:此时我们的工作路径为/root,这个路径下有一个目录demo,我们想把/root这个目录打包,但是不想要所有以demo开头的文件/目录,命令格式可以如下书写
- 注意:--exclude=rootTar.tar.bz2是因为,我们自己生成的压缩文件在/root目录下,但是不想将我们自己生成的这个压缩文件也包含进去,所以使用这一句
tar -jcv -f rootTar.tar.bz2 --exclude=demo* --exclude=rootTar.tar.bz2 /root
- 第二步:打包完之后,查看一下压缩包里面的内容,发现,demo这个目录并没有打包进来
tar -jtv -f rootTar.tar.bz
打包/压缩比某个时刻还要新的文件,--newer,--newer-mtime选项的使用
- --newer="日期":后面的时期包含mtime和ctime
- --newer-mtime="日期":后面的日期仅是mtime
- 何时使用:我们只想打包/压缩一些比某些事件还要新的文件,一些旧文件不需要,此时就需要这个参数。比如我们每个月都需要对某一个目录的内容进行备份,这样有了这个选项,就可以选择指定的日期来进行备份,从而不用全部文件都要再备份一次
演示案例:
- 我们想把/etc下面比/etc/passwd文件还要新的文件进行打包压缩,放入到/root目录下
- 第一步:查看/etc目录下哪些文件比/etc/passwd文件还要新
find /etc -newer /etc/passwd
- 第二步:查看/etc/passwd的日期时间为多少
ll /etc/passwd
- 第三步:上图可看出,日期为2019/02/10。所以把比这个日期还要新的文件打包压缩
tar -jcv -f /root/newerPasswd.tar.bz2 --newer-mtime="2019/02/10" /etc/*
- 第四步:压缩完之后,可以看到最后显示没有被备份的,即not dumped的意思。此时用grep这个命令调出.tar.bz2压缩文件中结尾非/的文件名,就是我们想要的
tar -jtv -f /root/newerPasswd.tar.bz2 | grep -v '/$'
解压文件:普通解压、配合-C选项使用
- 不使用-C选项解压:普通解压缩
tar -jxv -f /root/etc.tar.bz2
- 解压后生成一个etc/目录
- 使用-C选项解压:将压缩文件解压到/tmp目录下
tar -jxv -f /root/etc.tar.bz2 -C /tmp
解压文件:仅提取出压缩文件中的指定文件
例如:我们压缩后的/etc目录中有一个shadow文件,我们只想从压缩文件中解压出这个文件,其他的不解压
- 解压:tar -jxv -f /root/etc.tar.bz2 待解开的文件
tar -jxv -f /root/etc.tar.bz2 etc/shadow
特殊文件备份:磁带的备份
- 概念:tar除了可以将数据打包成为文件之间,还能够将文件打包到某些特殊的设备中,比如说磁带(tape)。由于磁盘是一次性读取/写入的设备,因此我们不能够使用类似于cp等命令来复制
- 例如:我们将/home、/root、/etc备份到磁带(/dev/st0)中,命令格式如下
tar -cv -f /dev/st0 /home /root /etc
特殊应用:利用管道命令与数据流
- 概念:在tar中,有一种特殊的方法,就是通过标准输入输出的数据流重定向(standard input/standard output),以及管道命令(pipe),将待处理的文件一边打包一边解压到目标目录
- 案例:
- 此时我们的工作目录为/tmp,我们将/etc整个目录一边打包一边在/tmp中解开
- 工作目录必须为/tmp。第一个-:代表输出文件,|:代表管道命令。第二个-:输入文件
- 其实这个操作与:cp -r /etc /tmp相同
tar -cvf - /etc | tar -xvf -
压缩解压后的SELinux问题
- 概念:如果有时,我们需要将备份的数据恢复到原本的系统中来使用,那么恢复之后,要注意系统的SELinux问题,尤其是系统文件(/etc等)。SELinux的权限问题可能让你的系统无法读写某些配置文件内容,导致影响到系统的正常使用
- 案例:
- 我们某次使用tar命令备份了/etc的数据,然后尝试在另一台系统上面恢复。恢复没问题,问题在于恢复完毕之后,无法正常的登录系统,明明是在单人维护的模式下去操作系统,可就是无法登陆。
- 原因:大部分原因可能就是/etc/shadow这个密码文件的SELinux类型在还原时被更改了,所以导致登录程序无法顺利的读取它
- 处理方法有以下几种:
- ①通过各种可行的恢复方式登录系统,然后修改/etc/selinux/config文件,将SELinux改成permissive模式,重新启动系统就正常了
- ②在第一次恢复系统后,不要立即重新启动,先使用restorecon -Rv /etc自动恢复一下SELinux的类型即可
- ③通过各种可行的方式登录系统,建立/.autorelabel文件,重新启动后系统会自动修复SELinux的类型,并且又会再次重新启动之后就正常了
- 推荐使用第②中方法。如果系统已经重新启动了,那么就使用第③中方式解决
系统重要文件的备份案例
- 概念:我们的系统中有许多的重要目录需要备份使用
- /etc/(配置文件)
- /home/(用户的家目录)
- /var/spool/mail/(系统中所有账号的邮箱)
- /var/spool/cron/(所有账号的定时任务配置文件)
- /root(系统管理员的家目录)
- 另外:/home/loop*不需要备份。并且/root下面的压缩文件也不需要备份
- 案例:
- 我们在根目录下建立一个/backups目录,将上面那些重要目录与不需要的目录打包压缩后备份到/backups目录中
- 备份文件名的格式最好带上日期,例如:back-system-日期
tar -jcv -f /backups/backuo-system-20190213.tar.bz2 --exclude=/root/*.bz2
--exclude=/root/*.gz --exclude=/home/loop* /etc /home /var/spool/mail /var/spool/cron /root
- 我是小董,V公众点击"笔记白嫖"解锁更多【Linux入门基础】资料内容。