Linux学习(12)--文件压缩

在 Linux 的环境中,我们可以看到许多压缩文件的扩展名。尽管说 Linux 的扩展名没什么作用,但是由于 Linux 支持的压缩命令非常多,彼此之间采用的压缩技术不同,可能造成无法互通的情况。所以为了照顾使用者,适当的扩展名还是必要的。下面是几个常见的压缩文件扩展名。

  • *.Z compress程序压缩的文件
  • *.gz gzip程序压缩的文件
  • *.bz2 bzip2程序压缩的文件
  • *.tar tar程序打包的数据,并没有经过压缩
  • *.tar.gz tar程序打包的数据,并且经过 gzip 压缩
  • *.tar.bz2 tar程序打包的数据,并且经过 bzip2 压缩

Linux 上常见的压缩命令就是 gzip 与 bzip2,至于compress 已经退出历史的舞台了。但是,经常 压缩/解压缩 都要好大一堆文件,所以出现了 tar 这个打包的命令。其实就是把很多文件“打包”成一个文件,甚至是目录等可以。

Linux压缩命令

gzip,zcat

范例1:将 /etc/man_db.conf 复制到 /tmp 中,并以gzip压缩
[root@VM_174_157_centos /]# cd /tmp/
[root@VM_174_157_centos tmp]# cp /etc/man_db.conf ./
[root@VM_174_157_centos tmp]# gzip -v man_db.conf 
man_db.conf:     61.9% -- replaced with man_db.conf.gz

[root@VM_174_157_centos tmp]# ll /etc/man_db.conf /tmp/man*
-rw-r--r--. 1 root root 5171 Jun 10  2014 /etc/man_db.conf
-rw-r--r--  1 root root 1998 Mar  9 14:45 /tmp/man_db.conf.gz

当你使用gzip进行压缩,在默认的状态下原本的文件会被压缩成为.gz的文件名,源文件就不存在了。而且,使用gzip压缩的文件在windows系统中,可以被WinRAR解压缩。

范例2:由于man_db.conf 是文本文件,将范例1中的压缩文件的内容读出来
[root@VM_174_157_centos tmp]# zcat man_db.conf.gz 
#因为它原本是文本文件,所以我们可以尝试使用 zcat 去读取
#此时屏幕上会直接显示出解压缩后的文件内容,在内容过多的情况下,建议配合less使用

bzip2,bzcat

如果 gzip 是为了代替 gzip,那么 bzip2 就是为了取代 gzip,它的压缩比要比 gzip 还好,用法几乎相同,如下:

[root@VM_174_157_centos tmp]# bzip2 [-cdkzv#] 文件名
选项与参数:
-c:将压缩的数据输出到屏幕上
-d:解压缩
-k:保留原文件,而不是删除
-z:压缩
-v:可以显示出原文件/压缩文件的压缩比等信息
-#:与 gzip 相同,都是在计算压缩比的参数,-9最好,-1最快


范例1:将刚才的 /tmp/man_db.conf 以 bzip2 压缩
[root@VM_174_157_centos tmp]# bzip2 -z man_db.conf 
#此时 man_db.conf 会变成 man_db.conf.bz2

范例2:将范例1的文件读出来
[root@VM_174_157_centos tmp]# bzcat man_db.conf.bz2

范例3:将范例1的文件解压缩
[root@VM_174_157_centos tmp]# bzip2 -d man_db.conf.bz2 

范例4:将范例3解开的 man_db.conf 用最佳的压缩比压缩,并保留原文本
[root@VM_174_157_centos tmp]# bzip2 -9c man_db.conf > man_db.conf.bz2

打包命令:tar

刚刚那两个命令都是将目录内的所有文件“分别”进行压缩的操作,那么类似 WinRAR 将很多数据“包成一个文件的”命令就是 tar了。tar 的参数非常多,只提讲个常用的参数:

[root@VM_174_157_centos tmp]# tar [-j|-z] [cv] [-f 新建的文件名]  filename...     <==打包与压缩
[root@VM_174_157_centos tmp]# tar [-j|-z] [tv] [-f 新建的文件名]                 <==查看文件名
[root@VM_174_157_centos tmp]# tar [-j|-z] [xv] [-f 新建的文件名] [-C 目录]        <==解压缩
选项与参数:
-c:新建打包文件,可搭配 -v 来查看过程中被打包的文件名(filename)
-t:查看打包文件的内容含有哪些文件名,重点在查看文件名
-x:解打包或解压缩的功能,解压缩可搭配-C(大写)在特定目录解开
    特别注意,-c,-t,-x不可同时出现在一串命令行中
-j:通过bzip2的支持进行压缩/解压缩,文件名最好为*.tar.bz2
-z:通过gzip的支持进行压缩/解压缩,文件名最好为*.tar.gz
-v:在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f filename:-f 后面要接被处理的文件名,建议 -f 单独写一个参数
-C 目录:这个参数用在解压缩时,若要在特定目录解压缩,可以使用这个参数

其他后续参数介绍:
-p:保留备份数据的基本权限与属性,常用于备份重要的配置文件
-P:保留绝对路径,即允许备份数据中含有根目录存在的意思
--exclude=FIFE:在压缩的过程中,不要将 FIFE 打包

其实最简单的使用 tar 就只要记忆下面的方式即可:

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

如果不加[-j | -z]的话,文件名最好叫*.tar即可。如果是对应的参数,就用对应的文件名。比如你如果使用 -j ,最好就是 *tar.bz2。另外,实际上 -zcvf 是可以一起写的,但是在学习的时候,我们为了了解地清楚,最好分开写,免得混淆。

使用 tar 加入 -j 或 -z 的参数

[root@VM_174_157_centos tmp]# tar [-j|-z] [cv] [-f 新建的文件名]  filename...     <==打包与压缩
[root@VM_174_157_centos tmp]# tar [-j|-z] [tv] [-f 新建的文件名]                 <==查看文件名
[root@VM_174_157_centos tmp]# tar [-j|-z] [xv] [-f 新建的文件名] [-C 目录]        <==解压缩
选项与参数:
-c:新建打包文件,可搭配 -v 来查看过程中被打包的文件名(filename)
-t:查看打包文件的内容含有哪些文件名,重点在查看文件名
-x:解打包或解压缩的功能,解压缩可搭配-C(大写)在特定目录解开
    特别注意,-c,-t,-x不可同时出现在一串命令行中
-j:通过bzip2的支持进行压缩/解压缩,文件名最好为*.tar.bz2
-z:通过gzip的支持进行压缩/解压缩,文件名最好为*.tar.gz
-v:在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f filename:-f 后面要接被处理的文件名,建议 -f 单独写一个参数
-C 目录:这个参数用在解压缩时,若要在特定目录解压缩,可以使用这个参数

其他后续参数介绍:
-p:保留备份数据的基本权限与属性,常用于备份重要的配置文件
-P:保留绝对路径,即允许备份数据中含有根目录存在的意思
--exclude=FIFE:在压缩的过程中,不要将 FIFE 打包

接下来让我们看看 -j 和 -z 的区别在哪里:

[root@VM_174_157_centos tmp]# tar -zpcv -f /root/etc.tar.gz /etc/
tar: Removing leading `/' from member names    <==注意这个警告信息
/etc
......
/etc/modprobe.d/mlx4.conf
/etc/ntp.conf
#因为加上了-v的参数,会显示正在作用中的文件名
#如果可以翻到第一页就可以发现上面的错误信息

[root@VM_174_157_centos ~]# tar -jpcv -f /root/etc.tar.bz2 /etc/
#显示的消息和上面一样

[root@VM_174_157_centos ~]# ll /root/etc*
-rw-r--r-- 1 root root 6342356 Mar  9 16:38 /root/etc.tar.bz2
-rw-r--r-- 1 root root 7240925 Mar  9 16:34 /root/etc.tar.gz

[root@VM_174_157_centos ~]# du -sh /etc
25M /etc

#这下知道为什么会建议你使用 -j 这个参数了吧!上面的数值一目了然

查阅 tar 文件的数据内容(可查看文件名)

[root@VM_174_157_centos ~]# tar -jtv -f /root/etc.tar.bz2
...前面省略...
-rw-r--r-- root/root      1004 2015-11-20 23:59 etc/modprobe.d/mlx4.conf
-rw-r--r-- root/root      2000 2016-05-31 18:11 etc/ntp.conf

加上 -v 可以连同属性与权限都看到。从上面的数据我们可以看到一件有趣的事情,那就是每个文件名都没了根目录。这也是上一个练习出现的那个警告信息“tar: Removing leading `/’ from member names(删除了文件名开头的 / )”所告诉的情况。

去掉根目录的主要原因还是为了安全,我们使用 tar 备份的数据可能会需要解压缩回来,在 tar 所记录的文件名那就是解压缩后的实际文件名。如果去掉了根目录,假设在 /tmp 解开,那么就会变为 /tmp/etc/xxx。但是如果没有去掉,,解压缩后就是绝对路径,即解压后的数据一定会被放置到 /etc/xxx 去。如此一来,原本的就会被覆盖掉,所以还是去掉比较安全,如果非要的话,那就加上 -P 的参数就好了。

[root@VM_174_157_centos ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp/
[root@VM_174_157_centos ~]# ll /tmp/
total 32
...
drwxr-xr-x 91 root root 4096 Mar  7 19:31 etc
...
# -C参数可以方便地将压缩包解压到指定目录

仅仅解开单一文件

当我们只想要解开打包文件内的其中一个文件该怎么办呢?是需要用 -jtv 找到你要的文件名然后解开即可,例子如下:

#1.先找到我们要的文件名,假设解开 shadow 文件
[root@VM_174_157_centos ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root       528 2017-03-07 19:31 etc/gshadow
---------- root/root       746 2017-02-25 17:51 etc/shadow-
---------- root/root       767 2017-03-07 19:31 etc/shadow        <==这是我们要的
---------- root/root       518 2017-02-25 17:51 etc/gshadow-
#这里使用 grep 命令和管道

#2.将该文件解开,语法与实际方法如下:
[root@VM_174_157_centos ~]# tar -jxv -f 打包文件.tar.bz2  待解开文件名
[root@VM_174_157_centos ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@VM_174_157_centos ~]# ll etc
total 4
---------- 1 root root 767 Mar  7 19:31 shadow
#在本例中,不能携程 /etc/shadow,因为它是记录在 etc.tar.bz2 内的文件名

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

假设我们想打包 /etc 和 /root下的几个重要目录,但是却不想要 /root/etc* 开头的文件。我们可以用 –exclude 来操作:

[root@VM_174_157_centos ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
> --exclude=/root/system.tar.bz2 /etc /root

上面的命令是一整行,其实你可以打成 tar -jcv -f /root/system.tar.bz2 –exclude=/root/etc* –exclude=/root/system.tar.bz2 /etc /root,如果想要两行输入,那就在最后加上反斜杠(\)并按下回车即可。

Tips:tar 打包出来的文件是否压缩得到的称呼不同。如果仅仅是打包“tar -cv -f file.tar”而已,我们称之为 tarfile。如果还进行了压缩,例如“tar -jcv -f file.tar.bz2”时,我们称之为 tarball

配合管道和数据流

通过标准输入输出的数据流重定向,以及管道命令(pipe)配合,我们还可以做类似下面的事:

[root@VM_174_157_centos tmp]# cd /tmp
[root@VM_174_157_centos tmp]# tar -cvf - /etc | tar -xvf -
# 要注意输出文件变成 - 而输入文件也变成了 - 
# 这就是代表了 standard input,standard output
# 我们可以将 - 想象为内存中的一个设备(缓冲区)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值