linux下的打包压缩gzip,gunzip,tar

打包和压缩

首先要弄清两个概念:打包和压缩。
打包是指将一大堆文件或目录变成一个总的文件;
压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。

gzip 压缩

gzip = gun + zip

XYBJM01617:d2 csw$ gzip -h
Apple gzip 272.201.1
usage: gzip [-123456789acdfhklLNnqrtVv] [-S .suffix] [<file> [<file> ...]]
 -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    压缩完打印压缩率等信息

gzip -[1-9] filename 指定压缩等级

指定压缩等级,数字越大,压缩耗费时间越久,压缩率越高。默认是 -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 大小一样,我觉得应该是到了压缩极限。


gzip -c filename 输出压缩结果到标准输出

把压缩后的文件内容直接输出到标准输出。

XYBJM01617:d2 csw$ gzip -c f1 > f1.gz
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ ls
f1	f1.gz	f2	f3

我们把标准输出重定向到 f1.gz 就生成了压缩文件


gzip -d filename 解压缩

解压缩

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


gzip -k filename 保留原文件

如果不见 -k 默认不会保留原文件,加上之后会保留原文件

XYBJM01617:d2 csw$ gzip -k f1
XYBJM01617:d2 csw$
XYBJM01617:d2 csw$ ls
f1	f1.gz	f2	f3

可以看到f1.gz保留了下来


gzip -f filename 强制覆盖同名文件

如果压缩后的文件名已经存在则会跳过提问环节,直接覆盖

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 ,系统会询问是否覆盖。


gzip -l filename 打印压缩信息

展示压缩的详细信息

XYBJM01617:d2 csw$ gzip -l f1.gz
  compressed uncompressed  ratio uncompressed_name
    16850592   2896363252  99.4% f1

从左到右依次是,压缩后文件大小,压缩前大小,压缩率和压缩前文件名称


gzip -n/N filename 保留源文件信息

默认是-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个字节,用来保存原文件的信息


gzip -r dir 递归压缩目录下文件

递归压缩目录下的所有文件

XYBJM01617:d1 csw$ gzip -r d2
XYBJM01617:d1 csw$ cd d2
XYBJM01617:d2 csw$ ls
f1.gz	f2.gz	f3.gz	f4.gz

gzip -S {suffix} filename 指定后缀

指定压缩后的文件名后缀

XYBJM01617:d2 csw$ gzip -S .suf f1
XYBJM01617:d2 csw$ ls
f1.suf	f2.gz	f3.gz	f4.gz

注意这里的点需要自己加上


gzip -t filename 检测文件

检测指定文件是否是压缩文件

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 参数检测。


gzip -v filename 输出压缩信息

默认压缩完不会有任何输出,加上 -v(小写) 会在压缩完成后输出压缩信息。

XYBJM01617:d2 csw$ gzip -v f2
f2:		   99.4% -- replaced with f2.gz

tar 打包/解包

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 <filename>  Location of archive
  -v    Verbose
  -w    Interactive
Create: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
  <file>, <dir>  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 <pattern>  Skip files that match pattern
  -C <dir>  Change to <dir> before processing remaining files
  @<archive>  Add entries from <archive> to output
List: tar -t [options] [<patterns>]
  <patterns>  If specified, list only entries that match
Extract: tar -x [options] [<patterns>]
  <patterns>  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

tar -c 打包

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 后缀,方便区分。


tar -x 解包

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 目录被解压了出来


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csw_coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值