6.1 tar:打包压缩命令
6.1.1 命令详解
【命令星级】 ★★★★★
【功能说明】
tar是Linux系统里将多个文件打包在一起并且可以实现将打包的文件解压的命令。tar是系统管理员最常用的命令之一,tar命令不但可以实现对多个文件进行打包,还可以实现对多个文件打包后进行压缩。
打包是指将一大堆文件或目录变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小的文件。
【语法格式】
tar [option] [file]
tar [选项] [文件或目录]
**说明:**在tar命令以及后面的选项里,每个元素之间至少要有一个空格。
【选项说明】
tar命令的参数选项的使用有点特殊,对于CentOS Linux来说“tar -z”和“tar z”效果相同,加或不加“-”这个符号都是可以的,这是重点。具体说明参数见表6-1。
表6-1 tar命令的参数选项及说明
6.1.2 使用范例
6.1.2.1 基础范例
**范例6-1:**备份站点目录html。
[root@centos7 ~]# mkdir -p /var/www/html/neteagle/test #先生成测试文件。
[root@centos7 ~]# touch /var/www/html/{1..10}.html #创建10个待备份文件。
[root@centos7 ~]# ls /var/www/html
10.html 2.html 4.html 6.html 8.html neteagle
1.html 3.html 5.html 7.html 9.html
[root@centos7 ~]# cd /var/www #进入到目标目录的上一级目录打包。
[root@centos7 /var/www]# ls
html
[root@centos7 /var/www]# tar zcvf www.tar.gz ./html/ #选项v会显示打包的过程,大家需要记住常用的打包命令组合zcvf,如果不想显示打包过程,则可以省略v选项,即选项组合为zcf。
./html/
./html/neteagle/
./html/neteagle/test/
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
[root@centos7 /var/www]# ll www.tar.gz
-rw-r--r--. 1 root root 254 Oct 25 15:02 www.tar.gz
**范例6-2:**查看压缩包内的内容。
[root@centos7 /var/www]# tar ztvf www.tar.gz #使用选项t不解压就可以查看压缩包的内容,选项v可以显示文件的属性。
drwxr-xr-x root/root 0 2020-10-25 15:01 ./html/
drwxr-xr-x root/root 0 2020-10-25 15:01 ./html/neteagle/
drwxr-xr-x root/root 0 2020-10-25 15:01 ./html/neteagle/test/
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/1.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/2.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/3.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/4.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/5.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/6.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/7.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/8.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/9.html
-rw-r--r-- root/root 0 2020-10-25 15:01 ./html/10.html
[root@centos7 /var/www]# tar ztf www.tar.gz #省略v选项。
./html/
./html/neteagle/
./html/neteagle/test/
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
[root@centos7 /var/www]# tar tf www.tar.gz #如果不指定z选项,那么tar命令也会自动判断压缩包的类型,自动调用gzip命令。
./html/
./html/neteagle/
./html/neteagle/test/
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
**范例6-3:**解压缩包的示例。
[root@centos7 /var/www]# tar zxvf www.tar.gz -C /tmp/ #选项C指定解压路径,不加C解压到当前目录。
./html/
./html/neteagle/
./html/neteagle/test/
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
[root@centos7 /var/www]# ls /tmp/html/
10.html 2.html 4.html 6.html 8.html neteagle
1.html 3.html 5.html 7.html 9.html
[root@centos7 /var/www]# tar xf www.tar.gz -C /tmp/ #如果不想看到太多的输出,则可以去掉v选项,功能不会受到影响。同时z选项也可以省略,只要涉及解压的操作,tar命令就能自动识别压缩包的压缩类型,但是压缩时必须要加上z选项。
**说明:**tar xfC www.tar.gz /tmp这种格式也可以,但是没有上面的命令直观好记。
**范例6-4:**排除打包的示例。
[root@centos7 /var/www]# tar zcvf www.tar.gz ./html/ --exclude=html/neteagle/test #test目录的结尾不要加“/”,否则会不成功。
neteagle/test
./html/
./html/neteagle/
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
[root@centos7 /var/www]# tar zcvf www.tar.gz ./html/ --exclude=html/neteagle/test --exclude=html/neteagle #排除2个以上目录的方法:并列使用多个--exclude。
./html/
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
**范例6-5:**排除多个文件打包参数-X。
[root@centos7 /var/www]# cat >list.txt<<EOF #将需要排除的所有文件名字放在一个文件中。
> 10.html
> 8.html
> 1.html
> 7.html
> 5.html
> EOF
[root@centos7 /var/www]# tar zcvf paichu.tar.gz ./html/ -X list.txt #使用参数-X接上要排除的文件列表。
./html/
./html/neteagle/
./html/neteagle/test/
./html/2.html
./html/3.html
./html/4.html
./html/6.html
./html/9.html
**说明:**清注意排除文件list.txt的位置。
**范例6-6:**打包软链接文件的示例。
[root@centos7 /var/www]# cd /etc
[root@centos7 /etc]# tar zcf local.tar.gz ./rc.local #使用常规参数zcf打包。
[root@centos7 /etc]# tar tvf local.tar.gz
lrwxrwxrwx root/root 0 2020-10-01 16:04 ./rc.local -> rc.d/rc.local
#这里是一个坑,如果不加特殊参数,那么打包之后的文件将是个软链接文件,而不是rc.local的实体内容。
采用-h参数打包链接文件,示例代码如下:
[root@centos7 /etc]# tar zcfh local.tar.gz ./rc.local #额外加上h参数进行打包。
[root@centos7 /etc]# tar tvf local.tar.gz
-rw-r--r-- root/root 473 2020-08-07 01:30 ./rc.local
对比压缩包内的文件类型之后,大家应该可以看出区别了吧?利用tar的通用选项zcf打包文件时,如果这个文件是链接文件(如/etc/rc.local),那么tar只会对链接文件本身打包,而不是对链接文件指向的真实文件打包,因此还需要额外使用-h选项将软链接文件对应的实体文件打包。
6.1.2.2 技巧性范例
**范例6-7:**解决tar使用–exclude选项时遇到的问题。
使用tar的时候,有时候需要排除要压缩的目录下的某个子目录,但此时可能会遇到一个问题,这和要压缩目录的相对路径和绝对路径的选择有关。比如:
[root@centos7 /var/www]# tar zcvf www.tar.gz ./html/ --exclude=/var/www/html/neteagle/test #打包路径为相对路径,--exclude的路径为绝对路径。
./html/
./html/neteagle/
./html/neteagle/test/ #没有成功排除。
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
[root@centos7 /var/www]# tar zcvf www.tar.gz ./html/ --exclude=html/neteagle/test #打包路径为相对路径,--exclude的路径为相对路径。
./html/
./html/neteagle/
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
[root@centos7 /var/www]# tar zcvf www.tar.gz ./html/ --exclude=neteagle/test #--exclude的相对路径去掉html也可以。
./html/
./html/neteagle/
./html/1.html
./html/2.html
./html/3.html
./html/4.html
./html/5.html
./html/6.html
./html/7.html
./html/8.html
./html/9.html
./html/10.html
[root@centos7 /var/www]# tar zcvf www.tar.gz /var/www/html/ --exclude=/var/www/html/neteagle/test #打包路径为绝对路径,--exclude的路径为绝对路径。
tar: Removing leading `/' from member names
/var/www/html/
/var/www/html/neteagle/
/var/www/html/1.html
/var/www/html/2.html
/var/www/html/3.html
/var/www/html/4.html
/var/www/html/5.html
/var/www/html/6.html
/var/www/html/7.html
/var/www/html/8.html
/var/www/html/9.html
/var/www/html/10.html
[root@centos7 /var/www]# tar zcvf www.tar.gz /var/www/html/ --exclude=html/neteagle/test #打包路径为绝对路径,--exclude的路径为相对路径。
tar: Removing leading `/' from member names
/var/www/html/
/var/www/html/neteagle/
/var/www/html/1.html
/var/www/html/2.html
/var/www/html/3.html
/var/www/html/4.html
/var/www/html/5.html
/var/www/html/6.html
/var/www/html/7.html
/var/www/html/8.html
/var/www/html/9.html
/var/www/html/10.html
[root@centos7 /var/www]# tar zcvf www.tar.gz /var/www/html/ --exclude=neteagle/test #--exclude的相对路径去掉html也可以。
tar: Removing leading `/' from member names
/var/www/html/
/var/www/html/neteagle/
/var/www/html/1.html
/var/www/html/2.html
/var/www/html/3.html
/var/www/html/4.html
/var/www/html/5.html
/var/www/html/6.html
/var/www/html/7.html
/var/www/html/8.html
/var/www/html/9.html
/var/www/html/10.html
通过上述例子可以得到如下的结论。
- 若需要打包的目录为相对路径,则–exclude后只能接相对路径。
- 若需要打包的目录为绝对路径,则–exclude后即能接绝对路径也能接相对路径。
- 为方便起见,–exclude的后接路径和打包路径应保持形式一致,要么都是相对路径,要么都是绝对路径。
6.1.2.3 生产案例
**范例6-8:**对/etc目录下所有的普通文件打包。
[root@centos7 /etc]# cd /etc
[root@centos7 /etc]# ls
abrt my.cnf.d
adjtime NetworkManager
aliases networks
...
#如果etc下包含有目录、普通文件等,那么怎样才能将普通文件找出来并打包在一个文件中?
[root@centos7 /etc]# cd ..
[root@centos7 /]# tar zcvf etc.tar.gz `find etc/ -type f` #使用find命令找到所有普通文件,在tar命令语句中嵌套一个反引号的find命令语句。
tar: Removing leading `/' from member names
/etc/fstab
/etc/crypttab
/etc/resolv.conf
/etc/grub.d/00_header
...
[root@centos7 /]# ll -h etc.tar.gz
-rw-r--r--. 1 root root 22M Oct 11 18:39 etc.tar.gz
6.1.3 经验技巧
在打包时,有以下经验技巧可供读者参考。
1)在打包一个目录之前,先进入到这个目录的上一级目录,然后执行打包命令,这是大部分情况下打包文件的规范操作流程。少数情况下,当打包需要完整的目录结构时,可以使用绝对路径进行打包,但是需要注意解压tar包时压缩包内的文件是否会覆盖原始文件。
2)打包模型为:tar zcf /路径/筐.tar.gz 相对路径/苹果。打包其实就是讲苹果放进筐里。
6.2 gzip:压缩或解压文件
6.2.1 命令详解
【命令星级】 ★★★★★
【功能说明】
gzip命令用于将一个大的文件通过压缩算法(Lempel-Zivcoding(LZ77))变成一个小的文件。gzip命令不能直接压缩目录,因此目录需要先用tar打包成一个文件,然后tar再调用gzip进行压缩。
【语法格式】
gzip [option] [file]
gzip [选项] [文件]
**说明:**在gzip命令及后面的选项里,每个元素之间都至少要有一个空格。
【选项说明】
表6-2针对该命令的参数选项进行了说明。
表6-2 gzip命令的参数选项及说明
6.2.2 使用范例
**范例6-9:**把目录下的每个文件都压缩成单独的.gz文件。
[root@centos7 /var/www]# cd html/
[root@centos7 /var/www/html]# ls
10.html 2.html 4.html 6.html 8.html neteagle
1.html 3.html 5.html 7.html 9.html
[root@centos7 /var/www/html]# gzip *.html #使用gzip命令压缩当前目录下所有以“.html”结尾的文件。
[root@centos7 /var/www/html]# ls
10.html.gz 2.html.gz 4.html.gz 6.html.gz 8.html.gz neteagle
1.html.gz 3.html.gz 5.html.gz 7.html.gz 9.html.gz
#“.gz”后缀是gzip命令自动添加的。
#gzip命令的缺点是压缩后源文件不见了,它的特性是压缩、解压都会自动删除源文件。
**范例6-10:**不解压显示上一个例子中每个压缩文件的信息。
[root@centos7 /var/www/html]# gzip -l *.gz #使用-l参数不解压显示文件的压缩信息,因为源文件都是空文件,所以压缩率都为0.0%。
compressed uncompressed ratio uncompressed_name
28 0 0.0% 10.html
27 0 0.0% 1.html
27 0 0.0% 2.html
27 0 0.0% 3.html
27 0 0.0% 4.html
27 0 0.0% 5.html
27 0 0.0% 6.html
27 0 0.0% 7.html
27 0 0.0% 8.html
27 0 0.0% 9.html
**范例6-11:**解压文件,并显示解压过程。
[root@centos7 /var/www/html]# gzip -dv *.gz #使用-d参数解压文件,使用-v参数显示解压过程。
10.html.gz: 0.0% -- replaced with 10.html
1.html.gz: 0.0% -- replaced with 1.html
2.html.gz: 0.0% -- replaced with 2.html
3.html.gz: 0.0% -- replaced with 3.html
4.html.gz: 0.0% -- replaced with 4.html
5.html.gz: 0.0% -- replaced with 5.html
6.html.gz: 0.0% -- replaced with 6.html
7.html.gz: 0.0% -- replaced with 7.html
8.html.gz: 0.0% -- replaced with 8.html
9.html.gz: 0.0% -- replaced with 9.html
[root@centos7 /var/www/html]# ls #查看解压后的结果,gz文件不存在了,只剩下html文件。
10.html 2.html 4.html 6.html 8.html neteagle
1.html 3.html 5.html 7.html 9.html
**范例6-12:**压缩解压保留源文件。
[root@centos7 /var/www/html]# cp /etc/services .
[root@centos7 /var/www/html]# ll -h services
-rw-r--r--. 1 root root 655K Oct 25 15:59 services
[root@centos7 /var/www/html]# gzip -c services >services.gz #使用-c选项与输出重定向符号将输出定向到services.gz。
[root@centos7 /var/www/html]# ll -h services* #源文件还在。
-rw-r--r--. 1 root root 655K Oct 25 15:59 services
-rw-r--r--. 1 root root 133K Oct 25 16:00 services.gz
[root@centos7 /var/www/html]# gzip -dc services.gz >services2 #使用-d选项解压。
[root@centos7 /var/www/html]# diff services services2 #对比源文件和解压后的文件,没有差别。
[root@centos7 /var/www/html]# ll -h services*
-rw-r--r--. 1 root root 655K Oct 25 15:59 services #成功实现压缩、解压保留源文件。
-rw-r--r--. 1 root root 655K Oct 25 16:01 services2
-rw-r--r--. 1 root root 133K Oct 25 16:00 services.gz
6.2.3 经验技巧
虽然上面使用重定向符号解决了保留源文件的问题,但是使用起来还是不太方便,因此这里告诉大家一个好方法:gzip套件包含了许多可以“在原地”处理压缩文件的实用程序。zcat、zgrep、zless、zdiff等实用程序作用分别与cat、grep、less和diff相同,但是它们操作的是压缩的文件。比如:
[root@centos7 /var/www/html]# zcat services.gz |head #zcat命令直接接上压缩文件就可以读压缩包。
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
[root@centos7 /var/www/html]# zcat services.gz >services #也可以直接解压处理重定向到文件。