一、标准压缩命令:gzip
gzip是常用的压缩工具,生成.gz的压缩文件,gzip压缩可以用gunzip解压。
[linux@ccloves exercises]$ gzip Alan Walker - Fade.mp3
[linux@ccloves exercises]$ ls
Alan Walker - Fade.mp3.gz
gzip后面跟上要压缩的文件,老陌发现压缩之后的扩展名是.gz,压缩之后源文件没有了。
解压文件用gunzip:
[linux@ccloves exercises]$ gunzip Alan Walker - Fade.mp3.gz
[linux@ccloves exercises]$ ls -l
total 4236
-rw-r--r-- 1 linux linux 4323034 Jul 18 13:41 Alan Walker - Fade.mp3
gzip命令有一些选项:
-c 将输出重定向到标准输出。
-d 解压文件
-r 对目录递归,将里面的文件分别压缩
-1... -9 指定压缩比
老陌测试-c 会把压缩的数据写到标准输出中,你会看到一些乱码,这是二进制格式。 压缩完发现原文件并没有删除,所以我们可以利用这个特点,创建压缩而保留源文件。
[linux@ccloves exercises]$ gzip -c Alan Walker - Fade.mp3 > Alan Walker - Fade.mp3.gz
[linux@ccloves exercises]$ ls -l
total 8444
-rw-r--r-- 1 linux linux 4323034 Jul 18 13:41 Alan Walker - Fade.mp3
-rw-r--r-- 1 linux linux 4301908 Jul 18 13:48 Alan Walker - Fade.mp3.gz
注意:后面通过重定向运算符 “>” 把重压缩后的数据流写到 Alan Walker - Fade.mp3.gz 文件中。
gzip -d 解压缩文件和 gunzip 压缩文件功能一样。
我们发现gzip不能压缩目录,为了做测试,老陌把/etc/目录复制过来,之后删除链接文件,之后压缩:
[linux@ccloves exercises]$ cp -r /etc . 2> /dev/null
[linux@ccloves exercises]$ find . -type l -exec rm {} ;
[linux@ccloves exercises]$ ls
Alan Walker - Fade.mp3 etc
[linux@ccloves exercises]$ gzip etc
gzip: etc is a directory -- ignored
cp和find命令我们都学过,其中2>这个重定向未接触过,他是把错误信息重定向到一个位置,这里是/dev/null。虽然不能压缩目录,但我们可以递归压缩目录中的文件:
gzip -r etc
压缩完之后,你进目录里看源文件都没有了,全是压缩后的,所以我们很少用。 如果想解压 gunzip -r etc 就可以了。
二、标准压缩命令:bzip2
bzip2生成.bz2格式的压缩文件,bzip2相对较新,压缩比更高。用bzip2压缩可以用bunzip2解压。
[linux@ccloves exercises]$ bzip2 Alan Walker - Fade.mp3
[linux@ccloves exercises]$ ls -l
total 4208
-rw-r--r-- 1 linux linux 4296076 Jul 18 13:48 Alan Walker - Fade.mp3.bz2
drwxr-xr-x 134 linux linux 12288 Jul 18 13:56 etc
我们发现和gzip一样,压缩完之后原文件没有了,但好在bzip2也有-c选项,可以把压缩的数据重定向到其它文件中,从而保留源文件。
bzip2不能压缩目录,也不能递归压缩。但我们之前学过find,可以查找之后压缩,实际上也能够完成对一个目录递归压缩:
find etc -not -type d -exec bzip2 {} ;
linux下还有很多压缩工具,比如: zip等,还可以安装windows下常用的rar, unrar命令,但linux下常用的就是bzip2和gzip两种。
三、文件归档tar命令
虽然bzip2,gzip不能对目录压缩,但可以通过tar命令把目录树保存在一个文件中,之后再压缩。tar命令早期用于把磁盘文件转换成一个文件进行磁带备份,tar就是tape archive(磁带归档)的缩写。
tar命令的常用选项:
- -c 用于创建归档文件
- -x 用于释放归档文件
- -t 用于列出归档文件内容
- -f 用于指定归档文件名
下面我们把etc目录归档到一个文件中。
[linux@ccloves exercises]$ tar -c -f etc.tar etc
[linux@ccloves exercises]$ ls -l
total 51668
-rw-r--r-- 1 linux linux 4323034 Jul 18 13:48 Alan Walker - Fade.mp3
drwxr-xr-x 134 linux linux 12288 Jul 18 14:05 etc
-rw-r--r-- 1 linux linux 48568320 Jul 18 14:13 etc.tar
这条命令的意思是对etc目录进行归档,归档的文件名是etc.tar,也就是说tar命令生成的文件扩展名是.tar,其中-f指定归档名是etc.tar,这个随意起。
我们想要看看tar档案里的文件,不用释放归档文件,用-t就可以查看归档文件里的文件列表。
[linux@ccloves exercises]$ tar -t -f etc.tar
etc/
etc/lightdm/
etc/lightdm/lightdm.conf
etc/lightdm/keys.conf
如果想要释放档案文件,可以用-x选项,这里要注意释放归档文件时,会释放到当前目录。如果我想释放到/tmp/etc目录中,则先要进入这个目录,之后再释放:
[linux@ccloves exercises]$ pwd
/home/linux/exercises
[linux@ccloves exercises]$ cd /tmp
[linux@ccloves tmp]$ tar -x -f /home/linux/exercises/etc.tar
[linux@ccloves tmp]$ ls -ld etc
drwxr-xr-x 134 linux linux 4096 Jul 18 14:05 etc
还有一种方法用一个参数 -C dir 或 --directory=dir 指定进入的目录(作用相当于 cd dir),之后再释放。 注意这个C是大写的,如果怕与创建弄混可以记住长命令选项 --directory=dir
tar -xf etc.tar --directory=/tmp
这条命令表示把etc.tar释放到/tmp目录中,至于用哪种方式用户自己喜好 。另外还要注意,比如我想归档 /etc/network目录,我想表达的意思是归档network目录,而不带etc路径
[linux@ccloves exercises]$ tar -c -f network.tar /etc/network
[linux@ccloves exercises]$ tar -t -f network.tar
etc/network/
etc/network/interfaces
etc/network/if-post-down.d/
我们会发现,归档里带etc目录,此时我们就先要切换到 /etc/目录里,之后再tar就可以了,或用-C来处理。
[linux@ccloves exercises]$ tar -c -f network.tar -C /etc network
[linux@ccloves exercises]$ tar -t -f network.tar
network/
network/interfaces
network/if-post-down.d/
network/if-post-down.d/avahi-daemon
我们发现,这回不带etc路径了,此时老陌明白-C的含义了。 注意上面的命令 -C /etc 后面有空格,之后是network目录名,相录于已经进入到etc目录了。
当我们把目录归档之后,就变成一个文件了,此时可以用gzip, bzip2进行压缩就可以了。如果想要一步到位,tar命令里面有-z, -j参数可以直接压缩。
- -z 表示调用gzip压缩和解压缩
- -j 表示调用bzip2压缩和解压缩
注意扩展名的命名是:.tar.gz, .tar.bz2
tar -czf etc.tar.gz etc
tar -cjf etc.tar.bz2 etc