本文主要是介绍linux压缩归档命令gzip、bzip2、xz、tar、zip详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文使用运行环境如下:
操作系统:Ubuntu Linux 18.04 64 bit
在windows
系统下常用winrar
、bindzip
等软件打包并压缩文件与文件夹,linux
下也有相应的工具,常用的压缩工具为gzip
、bzip2
、xz
和tar
,前三者只能压缩单个文件,使用tar
可以将文件目录打包后调用gzip
、bzip2
、xz
软件实现多个文件和目录打包压缩,另外,linux
下zip
与unzip
命令压缩/解压兼容windows
下zip
文件。
linux
压缩/解压命令众多,本文就来一探究竟,命令千万条,常用的也就几条而已。
1. gzip压缩/解压
gzip
是linux
系统流行且常用的压缩命令
1.1 命令
Usage: gzip [OPTION]... [FILE]...
# 压缩/解压
gzip [-cdtv#] 文件名
# 查看压缩文件
zcatz 文件名.gz
zmore 文件名.gz
zless 文件名.gz
# 查找压缩文件内容
zgrep -n '目标字符' 文件名.gz
1.2 选项
gzip选项可通过gzip -h
命令查询,以下为部分选项:
选项 | 详细 | 说明 |
---|---|---|
-c | stdout | 将压缩/解压后文件输出到标准输出上,并保留原始文件不变 |
-d | decompress | 解压缩,使用-d时相当于使用gunzip |
-f | force | 强行解开压缩文件,若文件已存在将被解压后的文件覆盖 |
-h | help | 帮助菜单 |
-k | keep | 保留原文件 |
-l | list | 显示每一个压缩文件的 压缩后大小 压缩前大小 压缩率 未压缩前文件名 |
-L | license | 显示软件许可证 |
-n | no-name | 压缩时不保存原始文件的文件名和时间戳,解压缩时不恢复原始文件的文件名和时间戳 |
-N | name | 压缩时保存原始文件的文件名和时间戳,解压缩时恢复原始文件的文件名和时间戳 |
-q | quiet | 抑制所有警告信息 |
-r | recursive | 递归地操作目录下的每一个文件,而不是将目录打包压缩成文件 |
-S | suffix=SUF | 在压缩文件上使用后缀SUF |
-t | test | 测试压缩文件完整性 |
-v | verbose | 显示压缩详细信息 |
-# | #为数字,表示压缩等级,-1压缩最快压缩比最差,-9压缩最慢压缩比最好,默认为-6 |
1.3 用法
选项千万条,常用一两条:
默认不带选项压缩/解压时,原文件将被删除
1.3.1 压缩文件且不保留原文件
$ echo "hello" > 1.txt # 新建1.txt文件,内容为"hello"
$ gzip 1.txt # 压缩1.txt文件
$ ls
1.txt.gz
1.txt.gz
即压缩后的文件,原文件1.txt
已经不存在
1.3.2 解压文件且不保留原文件
$ gzip -d 1.txt.gz # 使用-d选项表示解压
$ ls
1.txt
或者
$ gunzip 1.txt.gz # 使用gunzip解压,不推荐
$ ls
1.txt
1.3.3 压缩且保留原文件
>
号将输出到标准输出的数据重定向到 >
之后的文件中, 重命名压缩文件可以用这种方法
$ gzip -c 1.txt > 1.txt.gz # '>'号之后的文件可以自定义
$ ls
1.txt 1.txt.gz
或者
$ gzip -k 1.txt
$ ls
1.txt 1.txt.gz
1.3.4 解压且保留原文件
>
号将输出到标准输出的数据重定向到 >
之后的文件中, 重命名解压文件可以用这种方法
$ gzip -cd 1.txt.gz > 1.txt # '>'号之后的文件可以自定义
$ ls
1.txt 1.txt.gz
或者
$ gzip -dk 1.txt.gz
$ ls
1.txt 1.txt.gz
1.3.5 压缩/解压时显示信息
$ ls
1.txt
$ gzip -kv 1.txt
1.txt: -33.3% -- replaced with 1.txt.gz
$ ls
1.txt 1.txt.gz
$ rm 1.txt
$ gzip -dkv 1.txt.gz
1.txt.gz: -33.3% -- replaced with 1.txt
$ ls
1.txt 1.txt.gz
1.3.6 指定最佳压缩比
指定选项 -9
即指定了最大的压缩比
gzip -cvk9 1.txt > 1.txt.gz
1.3.7 查看压缩文件内容
zcat
、zmore
、zless
相当于适用gzip
压缩文件的查看工具
$ zcat 1.txt.gz
hello
$ zmore 1.txt.gz
hello
$ zless 1.txt
1.3.8 查找压缩文件中的字符串
zgrep
相当于适用gzip
压缩文件的查找工具
$ zgrep -n 'he' 1.txt.gz
1:hello
2. bzip2压缩/解压
bizp2
命令和gzip
基本相同,bzip2
命令压缩率更高
2.1 命令
usage: bzip2 [flags and input files in any order]
# 压缩/解压
bzip2 [-cdkzv#] 文件名
# 查看压缩文件
bzcat 文件名.bz2
bzmore 文件名.bz2
bzless 文件名.bz2
# 查找压缩文件内容
bzgrep -n '目标字符' 文件名.bz2
2.2 选项
bzip2选项通过bzip2 -h
命令查询,以下为部分选项:
选项 | 详细 | 说明 |
---|---|---|
-c | stdout | 将压缩/解压后文件输出到标准输出上,并保留原始文件不变 |
-d | decompress | 强制解压,相当于使用bunzip2 |
-k | keep | 保留原文件 |
-z | compress | 强制压缩,默认参数,可省略 |
-v | verbose | 可视化压缩/解压信息,如压缩比 |
-h | help | 打印帮助信息 |
-f | force | 覆盖已经存在的文件 |
-t | test | 测试压缩文件完整性 |
-q | quiet | 抑制非关键性错误 |
-s | small | 使用较少的内存,最多2500k |
-L | license | 打印许可证和版本 |
-V | version | 打印许可证和版本 |
-# | #为数字,表示压缩等级,-1压缩最快压缩比最差,-9压缩最慢压缩比最好 |
2.3 用法
2.3.1 压缩文件且不保留原文件
$ echo "bzip2" > 1.txt # 新建1.txt文件,内容为"bzip2"
$ cat 1.txt # 查看1.txt文件内容
bzip2
$ ls
1.txt
$ bzip2 1.txt # 压缩1.txt文件
$ ls
1.txt.bz2
1.txt.bz2
即压缩后的文件,原文件1.txt
已经不存在
2.3.2 解压文件且不保留原文件
$ ls
1.txt.bz2
$ bzip2 -d 1.txt.bz2 # 使用-d选项表示解压
$ ls
1.txt
或者
$ ls
1.txt.bz2
$ bunzip2 1.txt.bz2 # 使用bunzip2解压,不推荐
$ ls
1.txt
2.3.3 压缩且保留原文件
>
号将输出到标准输出的数据重定向到 >
之后的文件中, 重命名压缩文件可以用这种方法
$ ls
1.txt
$ bzip2 -c 1.txt > 1.txt.bz2 # '>'号之后的文件名可以自定义
$ ls
1.txt 1.txt.bz2
或者
$ ls
1.txt
$ bzip2 -k 1.txt
$ ls
1.txt 1.txt.bz2
2.3.4 解压且保留原文件
>
号将输出到标准输出的数据重定向到 >
之后的文件中, 重命名解压文件可以用这种方法
$ ls
1.txt.bz2
$ bzip2 -cd 1.txt.bz2 > 1.txt # '>'号之后的文件名可以自定义
$ ls
1.txt 1.txt.bz2
或者
$ ls
1.txt.bz2
$ bzip2 -dk 1.txt.bz2
$ ls
1.txt 1.txt.bz2
2.3.5 压缩/解压时显示信息
$ ls
1.txt
$ bzip2 -kv 1.txt 1.txt: 0.130:1, 61.333 bits/byte, -666.67% saved, 6 in, 46 out.
$ ls
1.txt 1.txt.bz2
$ rm 1.txt
$ bzip2 -dkv 1.txt.bz2 1.txt.bz2: done
$ ls
1.txt 1.txt.bz2
2.3.6 指定最佳压缩比
$ ls
1.txt
$ bzip2 -kv9 1.txt 1.txt: 0.130:1, 61.333 bits/byte, -666.67% saved, 6 in, 46 out.
$ ls
1.txt 1.txt.bz2
2.3.7 查看压缩文件内容
$ ls
1.txt 1.txt.bz2
$ bzcat 1.txt.bz2
bzip2
$ bzmore 1.txt.bz2
------> 1.txt.bz2 <------
bzip2
$ bzless 1.txt.bz2
------> 1.txt.bz2 <------
2.3.8 查找压缩文件中的字符串
$ bzgrep -n 'bz' 1.txt.bz2
1:bzip2
3. xz压缩/解压
总体来说,xz
的使用方法和gzip
、bzip2
大体相同,xz
的压缩率更高,因此压缩同样一个文件,使用xz
最费时但压缩后文件最小。
3.1 命令
Usage: xz [OPTION]... [FILE]...
# 压缩/解压
xz [dtlkc#] 文件名
# 查看压缩文件内容
xzcat 文件名.xz
xzmore 文件名.xz
xzless 文件名.xz
# 查找压缩文件内容
xzgrep -n '目标字符' 文件名.xz
3.2 选项
xz
选项通过xz -h
命令查询,以下为部分选项:
选项 | 详细 | 说明 |
---|---|---|
-c | stdout | 将压缩/解压后文件输出到标准输出上,并保留原始文件不变 |
-d | decompress | 强制解压,相当于使用unxz |
-k | keep | 保留原文件 |
-z | compress | 强制压缩,默认参数,可省略 |
-v | verbose | 显示压缩/解压过程中的一些信息,压缩时指定-vv将显示更多信息 |
-h | help | 打印帮助信息 |
-H | long-help | 显示更详细的帮助信息 |
-f | force | 覆盖已经存在的文件 |
-t | test | 测试压缩文件完整性 |
-l | list | 显示.xz后缀文件的信息 |
-e | extreme | 尝试通过使用更多的cpu时间获得更高的压缩率 |
-T | threads=NUM | 最多使用线程数,默认为1,为0时使用尽可能多的线程 |
-q | quiet | 抑制警告;指定两次以抑制错误 |
-V | version | 打印版本号 |
-# | #为数字,表示压缩等级,-1压缩最快压缩比最差,-9压缩最慢压缩比最好 |
3.3 用法
3.3.1 压缩且不保留原文件
$ echo "xz tool" > 1.txt # 新建1.txt文件内容为"xz tool"
$ ls # 列出当前路径下文件
1.txt
$ xz 1.txt # 压缩文件
$ ls
1.txt.xz
3.3.2 解压文件且不保留原文件
$ ls
1.txt.xz
$ xz -d 1.txt.xz
$ ls
1.txt
或者使用unxz
命令解压,效果和xz -d
相同
$ ls
1.txt.xz
$ unxz 1.txt.xz
$ ls
1.txt
3.3.3 压缩且保留原文件
使用重定向方式重命名压缩文件
$ ls
1.txt
$ xz -c 1.txt > 1.txt.gz # '>'号之后的文件名可以自定义
$ ls
1.txt 1.txt.gz
或者使用-k
保留原文件
$ ls
1.txt
$ xz -k 1.txt
$ ls
1.txt 1.txt.xz
3.3.4 解压且保留原文件
使用重定向方式重命名解压文件
$ ls
1.txt.xz
$ xz -cd 1.txt.xz > 1.txt # '>'号之后的文件名可以自定义
$ ls
1.txt 1.txt.xz
或者使用-k
保留原文件
$ ls
1.txt.xz
$ xz -dk 1.txt.xz # d表示解压,k表示保留原文件
$ ls
1.txt 1.txt.xz
3.3.5 压缩/解压时显示信息
$ ls
1.txt
$ xz -kv 1.txt
1.txt (1/1)100 % 64 B / 8 B = 8.000
$ ls
1.txt 1.txt.xz
$ rm 1.txt
$ xz -dkv 1.txt.xz
1.txt.xz (1/1)100 % 64 B / 8 B = 8.000
$ ls
1.txt 1.txt.xz
3.3.6 指定最佳压缩比
$ ls
1.txt
$ xz -kv9 1.txt
1.txt (1/1)100 % 64 B / 8 B = 8.000
$ ls
1.txt 1.txt.xz
3.3.7 查看压缩文件内容
$ ls
1.txt 1.txt.xz
$ xzcat 1.txt.xz
xz tool
$ xzmore 1.txt.xz
------> 1.txt.xz <------
xz tool
$ xzless 1.txt.xz
3.3.8 查找压缩文件中的字符串
$ ls
1.txt 1.txt.xz
$ xzgrep -n 'xz' 1.txt.xz
1:xz tool
4. tar打包压缩
前面介绍的gzip
、bzip2
和xz
命令只能压缩一个文件,而对于压缩整个目录或将多个文件压缩成一个文件就显得无能为力了,tar
命令提供了这样一种功能:将多个文件或目录打包成一个文件,同时支持使用gzip
、bzip2
、xz
命令对打包后的文件进行压缩,因此常见的后缀为.tar.gz
、.tar.bz2
、.tar.xz
。
4.1 命令
Usage: tar [OPTION...] [FILE]...
Examples:tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.tar -tvf archive.tar # List all files in archive.tar verbosely.tar -xf archive.tar # Extract all files from archive.tar.
# 打包与压缩
tar [-z][-j][-J] [cv] [-f 待建立的文件名] 文件名/目录列表...
# 查看文件名
tar [-z][-j][-J] [tv] [-f 已有的tar文件名]
# 解压缩
tar [-z][-j][-J] [xv] [-f 已有的tar文件名][-C 解压目录]
4.2 选项
[-z][-j][-J]
分别表示有gzip
、bzip2
、xz
的支持
tar
选项通过tar --help
命令查询,常用选项如下:
选项 | 详细 | 说明 |
---|---|---|
-c | create | 建立打包文件 |
-v | verbose | 查看过程中被打包的文件名 |
-t | list | 查看打包文件的内容含有哪些文件 |
-x | extract | 解压缩,搭配-C可指定解压目录,-c、-t、-x互斥 |
-C | 指定自定义的解压目录 | |
-f | file=ARCHIVE | -f后接立刻被处理的文件名 |
-z | gzip | 通过gzip压缩(cz)/解压(xz),默认后缀.tar.gz |
-j | bzip2 | 通过bzip2压缩(cj)/解压(xj),默认后缀.tar.bz2 |
-J | xz | 通过xz压缩(cJ)/解压(xJ),默认后缀.tar.xz |
-p | preserve-permissions | 保留备份数据原本权限与属性,常用于备份(-c)的配置文件 |
-P | absolute-names | 保留绝对路径,亦即允许备份数据中含有跟目录存在之意 |
–exclude=FILE | 压缩过程中,不要将FILE打包 |
4.3 用法
4.3.1 打包压缩目录
以借助gzip
为例,假设当前目录下有3个目录a、b、c,每个目录下分别有一个.c
文件,将当前目录打包压缩成union.tar.gz
$ ls
a b c
$ tree # 以树的形式列出当前目录结构,可用sudo apt install tree命令安装
.
├── a
│ └── a.c
├── b
│ └── b.c
└── c└── c.c3 directories, 3 files
$ tar -czv -f union.tar.gz ./
./
./c/
./c/c.c
./a/
./a/a.c
./b/
./b/b.c
tar: .: file changed as we read it
$ ls
a b c union.tar.gz
将多个文件打包压缩成一个文件
$ ls
union.tar.gz
$ touch {a..e}.txt # 新建a.txt b.txt c.txt d.txt e.txt文件
$ ls
a.txt b.txt c.txt d.txt e.txt union.tar.gz
$ tar -czv -f a-e.tar.gz {a..e}.txt
a.txt
b.txt
c.txt
d.txt
e.txt
$ ls
a-e.tar.gz a.txt b.txt c.txt d.txt e.txt union.tar.gz
4.3.2 查看压缩文件
$ ls
a-e.tar.gz union.tar.gz
$ tar -tv -f a-e.tar.gz
-rw-rw-r-- ryan/ryan 0 2020-11-22 02:55 a.txt
-rw-rw-r-- ryan/ryan 0 2020-11-22 02:55 b.txt
-rw-rw-r-- ryan/ryan 0 2020-11-22 02:55 c.txt
-rw-rw-r-- ryan/ryan 0 2020-11-22 02:55 d.txt
-rw-rw-r-- ryan/ryan 0 2020-11-22 02:55 e.txt
$ tar -tv -f union.tar.gz
drwxrwxr-x ryan/ryan 0 2020-11-22 02:49 ./
drwxrwxr-x ryan/ryan 0 2020-11-22 02:50 ./c/
-rw-rw-r-- ryan/ryan 0 2020-11-22 02:50 ./c/c.c
drwxrwxr-x ryan/ryan 0 2020-11-22 02:50 ./a/
-rw-rw-r-- ryan/ryan 0 2020-11-22 02:50 ./a/a.c
drwxrwxr-x ryan/ryan 0 2020-11-22 02:50 ./b/
-rw-rw-r-- ryan/ryan 0 2020-11-22 02:50 ./b/b.c
4.3.3 解压打包压缩文件
解压到当前目录
$ ls
a-e.tar.gz union.tar.gz
$ tar -xzv -f a-e.tar.gz
a.txt
b.txt
c.txt
d.txt
e.txt
$ ls
a-e.tar.gz a.txt b.txt c.txt d.txt e.txt union.tar.gz
$ tar -xzv -f union.tar.gz
./
./c/
./c/c.c
./a/
./a/a.c
./b/
./b/b.c
$ ls
a a-e.tar.gz a.txt b b.txt c c.txt d.txt e.txt union.tar.gz
解压到指定目录,这里解压到当前目录新建的tmp
目录
$ ls
a-e.tar.gz union.tar.gz
$ mkdir tmp
$ ls
a-e.tar.gz tmp union.tar.gz
$ tar -xzv -f union.tar.gz -C tmp/ # 将union.tar.gz解压缩到当前目录的tmp/目录下
./
./c/
./c/c.c
./a/
./a/a.c
./b/
./b/b.c
$ ls tmp/
a b c
$ tar -xzv -f a-e.tar.gz -C tmp/ # 将a-e.tar.gz解压缩到当前目录的tmp/目录下
a.txt
b.txt
c.txt
d.txt
e.txt
$ ls tmp/
a a.txt b b.txt c c.txt d.txt e.txt
5. zip压缩解压
zip
命令兼容windows
系统的zip
格式,前面介绍的gzip
、bzip2
、xz
均不能整个压缩目录,zip
命令提供了这样的支持,但zip
命令不提供查看文件内容的支持。压缩用zip
命令,解压用unzip
命令。
5.1 命令
Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Usage:
unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
# 压缩
zip [-qr] 压缩文件名.zip 源文件/源目录
# 解压
unzip 压缩文件名.zip
unzip 压缩文件名.zip -d 解压路径 #指定解压路径
5.2 选项
zip
常用选项:
选项 | 详细 | 说明 |
---|---|---|
-q | quiet operation | 静默压缩、解压 |
-r | recurse into directories | 递归操作,压缩目录时使用 |
-T | test zipfile integrity | 测试文件完整性 |
unzip
常用选项:
选项 | 详细 | 说明 |
---|---|---|
-l | list files | 查看压缩文件中的文件列表 |
-d | extract files into exdir | 指定解压路径 |
5.3 用法
5.3.1 压缩文件
压缩当前目录
$ ls
tmp
$ tree tmp/ # 列出tmp目录结构
tmp/
├── a
│ └── a.c
├── a.txt
├── b
│ └── b.c
├── b.txt
├── c
│ └── c.c
├── c.txt
├── d.txt
└── e.txt3 directories, 8 files
$ zip -qr tmp.zip tmp/ # 压缩当前目录下tmp目录到tmp.zip文件,目录需要-r
$ ls
tmp tmp.zip
5.3.2 解压文件
解压到当前文件夹
$ ls
tmp.zip
$ unzip tmp.zip
Archive: tmp.zipcreating: tmp/extracting: tmp/a.txt creating: tmp/c/extracting: tmp/c/c.c extracting: tmp/c.txt creating: tmp/a/extracting: tmp/a/a.c extracting: tmp/d.txt creating: tmp/b/extracting: tmp/b/b.c extracting: tmp/e.txt extracting: tmp/b.txt
$ ls
tmp tmp.zip
$ tree tmp
tmp
├── a
│ └── a.c
├── a.txt
├── b
│ └── b.c
├── b.txt
├── c
│ └── c.c
├── c.txt
├── d.txt
└── e.txt3 directories, 8 files
解压到指定文件夹,文件夹不存在时自动创建
$ unzip tmp.zip -d extrac/
Archive: tmp.zipcreating: extrac/tmp/extracting: extrac/tmp/a.txt creating: extrac/tmp/c/extracting: extrac/tmp/c/c.c extracting: extrac/tmp/c.txt creating: extrac/tmp/a/extracting: extrac/tmp/a/a.c extracting: extrac/tmp/d.txt creating: extrac/tmp/b/extracting: extrac/tmp/b/b.c extracting: extrac/tmp/e.txt extracting: extrac/tmp/b.txt
$ ls
extrac tmp tmp.zip
$ tree extrac/
extrac/
└── tmp├── a│ └── a.c├── a.txt├── b│ └── b.c├── b.txt├── c│ └── c.c├── c.txt├── d.txt└── e.txt4 directories, 8 files
5.3.3 查看压缩文件结构
$ unzip -l tmp.zip
Archive: tmp.zipLength Date Time Name
--------- ---------- ----- ----0 2020-11-22 03:23 tmp/0 2020-11-22 02:55 tmp/a.txt0 2020-11-22 03:23 tmp/c/0 2020-11-22 02:50 tmp/c/c.c0 2020-11-22 02:55 tmp/c.txt0 2020-11-22 03:23 tmp/a/0 2020-11-22 02:50 tmp/a/a.c0 2020-11-22 02:55 tmp/d.txt0 2020-11-22 03:23 tmp/b/0 2020-11-22 02:50 tmp/b/b.c0 2020-11-22 02:55 tmp/e.txt0 2020-11-22 02:55 tmp/b.txt
--------- -------0 12 files
6. 小结
- 本文主要总结了
gzip
、bzip2
、xz
以及tar
命令的常见用法,就压缩率来说xz>bzip2>gzip
,就压缩时间来说gzip<bzip2<xz
,这3个命令只能压缩单个文件; tar
命令提供了先将多个文件/目录打包,而后调用gzip
、bzip2
、xz
工具进行压缩的功能,是文件归档、压缩的常用工具;- 最后补充了
linux
系统zip
命令压缩/解压的常见用法,zip
命令使用-r
选项可以直接压缩目录,zip
命令暂时发现用得比较少; - 对
gzip
、bzip2
和xz
比较后,不难发现对三者的操作是类似的,掌握了一个,其他两个也就掌握了,tar
命令的常用选项也就那么一两个,熟能生巧,多用几次就记住了,实在记不住,还可以查命令帮助手册。
这篇关于linux压缩归档命令gzip、bzip2、xz、tar、zip详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!