首先要弄清两个概念:打包和压缩。
打包是指将一大堆文件或目录变成一个总的文件;
压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。
gzip = gun + zip
XYBJM01617:d2 csw$ gzip -h
Apple gzip 272.201.1
usage: gzip [-123456789acdfhklLNnqrtVv] [-S .suffix] [ [ ...]]
-1 --fast fastest (worst) compression 最快(最糟糕)的方式压缩文件
-2 .. -8 set compression level 设置压缩比率
-9 --best best (slowest) compression 最慢(最好)的方式压缩文件
-c --stdout write to stdout, keep original files 把压缩后的内容输出到标准输出,保留原文件
--to-stdout
-d --decompress uncompress files 解压
--uncompress
-f --force force overwriting & compress links 强行压缩文件,不理会文件名称或硬连接是否存在以及该文件是否为符号连接;
-h --help display this help 展示帮助信息
-k --keep don't delete input files during operation 保留原始文件
-l --list list compressed file contents 展示压缩文件的信息
-N --name save or restore original file name and time stamp 保存或恢复原文件名称和时间戳
-n --no-name don't save original file name or time stamp 不保存源文件名称和时间戳
-q --quiet output no warnings 不输出waring
-r --recursive recursively compress files in directories 递归压缩目录下的所有文件
-S .suf use suffix .suf instead of .gz 指定压缩文件的后缀
--suffix .suf
-t --test test compressed file 测试文件是否可以压缩
-V --version display program version 展示程序版本
-v --verbose print extra statistics 压缩完打印压缩率等信息
指定压缩等级,数字越大,压缩耗费时间越久,压缩率越高。默认是 -6
我们创建三个同样大小的文件,通过不同的等级压缩看看效果
XYBJM01617:d2 csw$ ls -l
total 16994432
-rw-r--r-- 1 csw staff 2896363252 6 8 15:41 f1
-rw-r--r-- 1 csw staff 2896363252 6 8 15:40 f2
-rw-r--r-- 1 csw staff 2896363252 6 8 15:57 f3
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ gzip -1 f1
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ gzip -9 f2
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ gzip f3
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ ls -l
total 149504
-rw-r--r-- 1 csw staff 41861113 6 8 15:41 f1.gz
-rw-r--r-- 1 csw staff 16850592 6 8 15:40 f2.gz
-rw-r--r-- 1 csw staff 16850592 6 8 15:57 f3.gz
我们可以看到 -9 和 -1 之间的压缩率会相差很多,当然 -1 要比 -9 快很多。至于为什么默认的 -6 和 -9 大小一样,我觉得应该是到了压缩极限。
把压缩后的文件内容直接输出到标准输出。
XYBJM01617:d2 csw$ gzip -c f1 > f1.gz
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ ls
f1 f1.gz f2 f3
我们把标准输出重定向到 f1.gz 就生成了压缩文件
解压缩
XYBJM01617:d2 csw$ gzip -d f1.gz
f1 already exists -- do you wish to overwrite (y or n)? y
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ ls
f1 f2 f3
应该等同于gunzip
如果不见 -k 默认不会保留原文件,加上之后会保留原文件
XYBJM01617:d2 csw$ gzip -k f1
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ ls
f1 f1.gz f2 f3
可以看到f1.gz保留了下来
如果压缩后的文件名已经存在则会跳过提问环节,直接覆盖
XYBJM01617:d2 csw$ gzip f1
f1.gz already exists -- do you wish to overwrite (y or n)? n
not overwriting
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ gzip -f f1
XYBJM01617:d2 csw$ ls
f1.gz f2 f3
可以看到,如果不指定 -f ,系统会询问是否覆盖。
展示压缩的详细信息
XYBJM01617:d2 csw$ gzip -l f1.gz
compressed uncompressed ratio uncompressed_name
16850592 2896363252 99.4% f1
从左到右依次是,压缩后文件大小,压缩前大小,压缩率和压缩前文件名称
默认是-N,也就是在压缩文件里会保存原文件的文件名和时间戳信息。-n的话不会保存。
XYBJM01617:d2 csw$ gzip -n f2
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ gzip f3
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ ls -l
total 5746432
-rw-r--r-- 1 csw staff 2896363252 6 8 17:52 f1
-rw-r--r-- 1 csw staff 16850589 6 8 15:40 f2.gz
-rw-r--r-- 1 csw staff 16850592 6 8 15:57 f3.gz
我们可以看到 f3.gz 比 f2.gz 多了3个字节,用来保存原文件的信息
递归压缩目录下的所有文件
XYBJM01617:d1 csw$ gzip -r d2
XYBJM01617:d1 csw$ cd d2
XYBJM01617:d2 csw$ ls
f1.gz f2.gz f3.gz f4.gz
指定压缩后的文件名后缀
XYBJM01617:d2 csw$ gzip -S .suf f1
XYBJM01617:d2 csw$ ls
f1.suf f2.gz f3.gz f4.gz
注意这里的点需要自己加上
检测指定文件是否是压缩文件
XYBJM01617:d2 csw$ ls
f1.suf f2 f3.gz f4.gz
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ gzip -t f1.suf
XYBJM01617:d2 csw$ gzip -t f2
gzip: f2: not in gzip format
XYBJM01617:d2 csw$
可以看到如果不是压缩文会有提示,否则没有输出。有时候压缩文件名没有 .gz 后缀,就可以用 -t 参数检测。
默认压缩完不会有任何输出,加上 -v(小写) 会在压缩完成后输出压缩信息。
XYBJM01617:d2 csw$ gzip -v f2
f2: 99.4% -- replaced with f2.gz
tar命令可以为linux的文件和目录创建档案。
利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。
tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。
利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
XYBJM01617:gzip csw$ tar -h
tar(bsdtar): manipulate archive files
First option must be a mode specifier: 第一个选项必须是模式说明符
-c Create -r Add/Replace -t List -u Update -x Extract
Common Options:
-b # Use # 512-byte records per I/O block
-f Location of archive
-v Verbose
-w Interactive
Create: tar -c [options] [ | | @ | -C ]
, add these items to archive
-z, -j, -J, --lzma Compress archive with gzip/bzip2/xz/lzma 打包的同时压缩
--format {ustar|pax|cpio|shar} Select archive format
--exclude Skip files that match pattern
-C Change to before processing remaining files
@ Add entries from to output
List: tar -t [options] []
If specified, list only entries that match
Extract: tar -x [options] []
If specified, extract only entries that match
-k Keep (don't overwrite) existing files 不要覆盖存在的文件
-m Don't restore modification times 不要恢复修改时间
-O Write entries to stdout, don't restore to disk 将条目写到标准输出,不需要还原到磁盘
-p Restore permissions (including ACLs, owner, file flags) 恢复权限
bsdtar 2.8.3 - libarchive 2.8.3
XYBJM01617:gzip csw$ tar -c -v -f d1.tar d1
a d1
a d1/d3
a d1/d2
a d1/d2/f4.gz
a d1/d2/f1.suf
a d1/d2/f2
a d1/d2/f.tar
a d1/d2/f2.gz
a d1/d2/f3.gz
XYBJM01617:gzip csw$ ls
d1 d1.tar
可以看到生成了打包文件d1.tar,我们可以用 -t 看下归档文件里的内容
XYBJM01617:gzip csw$ tar -t -f d1.tar
d1/
d1/d3/
d1/d2/
d1/d2/f4.gz
d1/d2/f1.suf
d1/d2/f2
d1/d2/f.tar
d1/d2/f2.gz
d1/d2/f3.gz
那如果我想打包的同时压缩文件呢,只需要用 -z, -j, -J 参数即可指定压缩方式
XYBJM01617:gzip csw$ tar -c -z -v -f d1.tar d1
a d1
a d1/d3
a d1/d2
a d1/d2/f4.gz
a d1/d2/f1.suf
a d1/d2/f2
a d1/d2/f.tar
a d1/d2/f2.gz
a d1/d2/f3.gz
XYBJM01617:gzip csw$ ls
d1 d1.tar
XYBJM01617:gzip csw$
XYBJM01617:gzip csw$ gzip -t d1.tar
XYBJM01617:gzip csw$
这时候的 d1.tar 已经是经过压缩之后的文件。这里需要注意的是,系统不会自动加 .zip 后缀,所以建议指定文件名的时候加上 .tar.gz 后缀,方便区分。
XYBJM01617:gzip csw$ ls
d1.tar
XYBJM01617:gzip csw$
XYBJM01617:gzip csw$ tar -x -v -f d1.tar
x d1/
x d1/d3/
x d1/d2/
x d1/d2/f4.gz
x d1/d2/f1.suf
x d1/d2/f2
x d1/d2/f.tar
x d1/d2/f2.gz
x d1/d2/f3.gz
XYBJM01617:gzip csw$ ls
d1 d1.tar
可以看到 d1 目录被解压了出来