快速理解Linux的压缩命令

0. 前言

在Linux的环境中,压缩文件的扩展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.bz2』,相对应的命令有tar、gz、bz2。命令比较多,而且每条命令的参数也很多,每次碰到都不得不google百度之。此文帮你快速的理清这些命令的简单用法,至于更复杂的用法可自行man page。

1. gzip,zcat

首先介绍一下gzip命令。
gzip 可以说是应用度最广的压缩命令!
gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件。
gzip 所创建的压缩文件后缀为 *.gz。
gzip命令的用法和范例如下:

[root@www ~]# gzip [-cdtv#] 文件名
选项与参数:
-c  :将压缩的数据输出到萤幕上,可透过数据流重导向来处理;
-d  :解压缩的参数;
-t  :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v  :可以显示出原文件/压缩文件的压缩比等信息;
-#  :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6

范例一:将 /etc/man.config 复制到 /tmp ,并且以 gzip 压缩
[root@www ~]# cd /tmp 
[root@www tmp]# cp /etc/man.config .
[root@www tmp]# gzip -v man.config
man.config:      56.1% -- replaced with man.config.gz
[root@www tmp]# ll /etc/man.config /tmp/man*
-rw-r--r-- 1 root root 4617 Jan  6  2007 /etc/man.config
-rw-r--r-- 1 root root 2684 Nov 10 17:24 /tmp/man.config.back.Z
-rw-r--r-- 1 root root 2057 Nov 10 17:14 /tmp/man.config.gz  <==gzip压缩比较佳
# 当你使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的文件, 原始文件就不再存在了。

范例二:将范例一的文件解压缩
[root@www tmp]# gzip -d man.config.gz
# 不要使用 gunzip 这个命令,不好背!使用 gzip -d 来进行解压缩!
# 与 gzip 相反, gzip -d 会将原本的 .gz 删除,产生原本的 man.config 文件。

范例三:将范例二解开的 man.config 用最佳的压缩比压缩,并保留原本的文件
[root@www tmp]# gzip -9 -c man.config > man.config.gz
# 其实 gzip 的压缩已经最佳化过了,所以虽然 gzip 提供 1~9 的压缩等级,不过使用默认的 6 就非常好用了!

如果压缩文件为文字文件,可不解开直接通过zcat命令读取。

[root@www ~]# zcat 文件名.gz
范例四:由于 man.config 是文字文件,可将范例一的压缩文件的内容读出来!
[root@www tmp]# zcat man.config.gz
# 此时萤幕上会显示 man.config.gz 解压缩之后的文件内容!

cat 可以读取纯文字文件,zcat 则可以读取纯文字文件被压缩后的压缩文件!

2. bzip2,bzcat

若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。
bzip2 的用法几乎与 gzip 相同。
bzcat功能和用法和zcat相同。
不信看看:

[root@www ~]# bzip2 [-cdkzv#] 文件名
[root@www ~]# bzcat 文件.bz2
选项与参数:
-c  :将压缩的过程产生的数据输出到萤幕上!
-d  :解压缩的参数
-k  :保留原始文件,而不会删除原始的文件喔!
-z  :压缩的参数
-v  :可以显示出原文件/压缩文件的压缩比等信息;
-#  :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!

范例一:将刚刚的 /tmp/man.config 以 bzip2 压缩
[root@www tmp]# bzip2 -z man.config 
# 此时 man.config 会变成 man.config.bz2 !

范例二:将范例一的文件内容读出来!
[root@www tmp]# bzcat man.config.bz2
# 此时萤幕上会显示 man.config.bz2 解压缩之后的文件内容!!

范例三:将范例一的文件解压缩
[root@www tmp]# bzip2 -d man.config.bz2

范例四:将范例三解开的 man.config 用最佳的压缩比压缩,并保留原本的文件
[root@www tmp]# bzip2 -9 -c man.config > man.config.bz2
3. 打包命令tar

gzip和bzip2主要用于单一文件的压缩,虽然 gzip 与 bzip2 也能够针对目录来进行压缩,不过,这两个命令对目录的压缩指的是『将目录内的所有文件 "分别" 进行压缩』的动作! 而不像在 Windows 的系统,可以使用类似 WinRAR 这一类的压缩软件来将好多数据『包成一个文件』的样式。
Linux下可以用大名鼎鼎的tar命令来打包文件。
由于 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持.tar.gz 文件名的解压缩。

tar 的选项与参数非常的多:

[root@www ~]# tar [-j|-z] [cv] [-f 创建的文件名] filename... <==打包与压缩
[root@www ~]# tar [-j|-z] [tv] [-f 创建的文件名]             <==查看文件名
[root@www ~]# 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  :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P  :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!

其实最简单的使用 tar 就只要记忆底下的方式即可:
1) 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
2) 查 询:tar -jtv -f filename.tar.bz2
3) 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
那个filename.tar.bz2是我们自己取的文件名,tar 并不会主动的产生创建的文件名,所以扩展名就显的很重要了!
如果不加 [-j|-z] 的话,文件名最好取为 *.tar 即可。如果是 -j 选项,代表有 bzip2 的支持,因此文件名最好就取为 *.tar.bz2 ;如果是加上了-z的 gzip 的支持,那文件名最好取为*.tar.gz
有些人喜欢把-jcv -f选项写成-jcvf,意思是一样的,看读者个人喜好。

使用 tar 加入 -j 或 -z 的参数备份 /etc/ 目录:

[root@www ~]# tar -zcv -f /root/etc.tar.gz /etc
/etc/
....中间省略....
/etc/esd.conf
/etc/crontab
# 由于加上 -v 这个选项,因此正在作用中的文件名就会显示在萤幕上。
# 至于-p的选项,重点在于『保留原本文件的权限与属性』之意。

[root@www ~]# tar -jcv -f /root/etc.tar.bz2 /etc
# 显示的信息会跟上面一模一样罗!

[root@www ~]# ll /root/etc*
-rw-r--r-- 1 root root  8740252 Nov 15 23:07 /root/etc.tar.bz2
-rw-r--r-- 1 root root 13010999 Nov 15 23:01 /root/etc.tar.gz
[root@www ~]# du -sm /etc
118     /etc
# 为什么建议您使用 -j 这个选项?从上面的数值你可以知道了吧?^_^

查阅 tar 文件的数据内容(可查看文件名),与备份文件名有否根目录的意义:

[root@www ~]# tar -jtv -f /root/etc.tar.bz2
....前面省略....
-rw-r--r-- root/root  1016 2008-05-25 14:06:20 etc/dbus-1/session.conf
-rw-r--r-- root/root   153 2007-01-07 19:20:54 etc/esd.conf
-rw-r--r-- root/root   255 2007-01-06 21:13:33 etc/crontab

将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用):

[root@www ~]# tar -jxv -f /root/etc.tar.bz2
[root@www ~]# ll
....(前面省略)....
drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
....(后面省略)....

此时该打包文件会在『本目录下进行解压缩』的动作!如果要制定解压的目录,可以用-C

[root@www ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@www ~]# ll /tmp
....(前面省略)....
drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
....(后面省略)....

刚刚上头我们解压缩都是将整个打包文件的内容全部解开!想像一个情况,如果我只想要解开打包文件内的其中一个文件而已, 那该如何做呢?很简单的,你只要使用 -jtv 找到你要的文件名,然后将该文件名解开即可。 我们用底下的例子来说明一下:

# 1. 先找到我们要的文件名,假设解开 shadow 文件好了:
[root@www ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
-r-------- root/root  1230 2008-09-29 02:21:20 etc/shadow-
-r-------- root/root   622 2008-09-29 02:21:20 etc/gshadow-
-r-------- root/root   636 2008-09-29 02:21:25 etc/gshadow
-r-------- root/root  1257 2008-09-29 02:21:25 etc/shadow  <==这是我们要的!
# 先搜寻重要的文件名!其中那个 grep 是『撷取』关键字的功能!我们会在第三篇说明!
# 这里您先有个概念即可!那个管线 | 配合 grep 可以撷取关键字的意思!

# 2. 将该文件解开!语法与实际作法如下:
[root@www ~]# tar -jxv -f 打包档.tar.bz2 待解开文件名
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@www ~]# ll etc
total 8
-r-------- 1 root root 1257 Sep 29 02:21 shadow  <==只有一个文件啦!

假设我们想要打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件, 因为该文件都是刚刚我们才创建的备份文件!而且假设这个新的打包文件要放置成为 /root/system.tar.bz2,当然这个文件自己不要打包自己,此时我们可以通过--exclude(不包括)来实现:

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

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值