Linux 常用的压缩与解压缩命令有:tar、gzip、gunzip、bzip2、bunzip2、compress 、uncompress、 zip、 unzip、rar、unrar 等。

1. 概览

Linux下常见的压缩包格式有5种:

  • zip

  • tar.gz

  • tar.bz2

  • tar.xz

  • tar.Z

    tar是打包格式,来源于最初打包程序被设计的目的:将文件备份到磁带上(tape archive)。tar命令本身只有打包作用,并不会进行压缩。

**tar.**后的内容指的是压缩方式,常见的压缩方式有:

  • gz:gzip格式(GUNZip)
  • bz2:bzip2格式(basic leucine-zipper 2)

2. 对目录(文件夹)进行压缩/解压

不管使用何种压缩方法,都必须首先对目录进行打包操作,因此需要使用tar。需要说明的是,可能是由于tar 命令更多地受到古老的 UNIX 风格影响, 以下tar 命令中的连接符 - 不是必须的,可以省略。
压缩方式以gzip为例(如使用bz2,只需把参数中的g替换成j即可。)

2.1 tar相关参数

主选项:

  • -c: create,建立压缩档案
  • -x:extract,从文件中提取(即解压)
  • -t:list,查看目标tar包中目录和文件列表
  • -r:append,向压缩归档文件末尾追加文件
  • -u:update,更新原压缩包中的文件
    注意:以上5个命令是互斥的,使用了其中1个便不能再同时使用其他的4个命令。

辅助选项:

  • -f:file,使用档案文件或设备,这个选项在如今通常是必选的
  • -m:modification time,把所有文件的修改时间设定为现在
  • -v:verbose,在压缩或解压缩过程中显示正在处理的文件名
  • -w:interaction,进行每一步都需要确认
  • -N: newer,比后面接的日期更新的文件才会被打包
  • -p:preserve-permissions,保留压缩包内所有文件的属性、权限
  • -z:tar.gz,用gzip来压缩或解压
  • -Z:tar.Z,用compress来压缩或解压
  • -j:tar.bz2,用bzip2来压缩或解压
  • -J:tar.xz,用xz来压缩或解压

需要使用多个参数时,除了f需要放在最后,其他不做要求。

2.2 实例

以目录 /myexample为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#压缩tar.gz
tar -zcvf myexample.tar.gz myexample/
#压缩当前目录下所有.py文件到tar.gz
tar -zcvf all_py_file.tar.gz *.py

#解压tar.gz
tar -zxvf myexample.tar.gz
#解压tar.gz到指定文件夹
tar -zxvf myexample.tar.gz -C $PATH
#压缩tar.Z
tar -Zcvf myexample.tar.Z myexample/

#解压tar.Z
tar -Zxvf myexample.tar.Z
#压缩tar.bz2
tar -jcvf myexample.tar.gz myexample/

#解压tar.bz2
tar -jxvf myexample.tar.bz2
#压缩tar.xz
tar -Jcvf myexample.tar.xz myexample/

#解压tar.xz
tar -Jxvf myexample.tar.xz

其他一些可能常用的操作:

1
2
3
4
5
6
7
8
9
#查阅myexample.tar.gz中有哪些文件
tar -ztf myexample.tar.gz
tar -ztvf myexample.tar.gz #会显示所有文件的详细信息,包括权限、创建时间等
#只压缩比2019-1-17更新的文件
tar -N '2019/1/17' -zcvf myexample.tar.gz myexample/
#压缩myexample文件夹下除了子文件夹mysub的所有文件
tar --exculde myexample/mysub -zcvf myexample.tar.gz
#只解压myexample.tar.gz内子文件夹mysub
tar -zxvf myexample.tar.gz mysub #根目录myexample不需要写

2.3 注意事项

1.关于tar的详细命令可以使用如下命令:

1
tar --help

2.事实上, 从1.15版本开始tar就可以自动识别压缩的格式,故不需人为区分压缩格式就能正确解压:

1
2
3
4
tar -xvf filename.tar.gz
tar -xvf filename.tar.bz2
tar -xvf filename.tar.xz
tar -xvf filename.tar.Z

3 对文件进行压缩/解压

example.py为例。

3.1 gzip zcat

  • -c :stdout,以标准输出书写,并保留源文件
  • -d :decompress,解压缩参数
  • -t :test,检验一个压缩档的一致性,看看文件有无错误;
  • -# :压缩等级,-1 最快,压缩比最差;-9 最慢,压缩比最好;默认为-6
1
2
3
4
5
6
7
8
9
10
11
#压缩.gz
gzip example.py #原来的example.py文件会消失并产生example.py.gz文件
#压缩.gz并保留源文件
gzip -c example.py > example.py.gz
#压缩.gz并保留源文件,以-9等级
gzip -9 -c example.py > example.py.gz

#解压.gz
gzip -d example.py.gz
#显示.gz文件内容
zcat example.py.gz

3.2 bzip2, bzcat

  • -c :stdout,以标准输出书写,并保留源文件
  • -d :解压缩的参数
  • -z :压缩的参数
  • -# :压缩等级,-1 最快,压缩比最差;-9 最慢,压缩比最好;默认为-6
1
2
3
4
5
6
7
8
9
10
11
#压缩bz2
bzip2 -z example.py #原来的example.py文件会消失并产生example.py.bz2文件
#压缩.bz2并保留源文件
bzip2 -c example.py > example.py.bz2
#压缩.bz2并保留源文件,以-9等级
bzip2 -9 -c example.py > example.py.bz2

#解压.bz2
bzip2 -d example.py.bz2
#显示.gz文件内容
bzcat example.py.bz2

4. zip压缩、unzip解压缩命令的使用详解

4.1 zip 压缩

zip 压缩主要参数

  • -f 更新现有的文件
  • -u 与 -f 参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中
  • -d 指定文件解压缩后所要存储的目录
  • -m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中
  • -r 将指定的目录下的所有子目录以及文件一起处理
  • -j 不处理压缩文件中原有的目录路径
  • -0 只存储,不压缩
  • -l 显示压缩文件内所包含的文件
  • -1 较快速度的压缩
  • -9 较高质量的压缩
  • -q 安静模式,在压缩的时候不显示指令的执行过程
  • -v 执行时显示详细的信息
  • -c 将解压缩的结果显示到屏幕上,并对字符做适当的转换
  • -z 仅显示压缩文件的备注文字
  • -@ 从标准输入中读取名称,一个路径名称用一行
  • -o 将压缩文件内的所有文件的最新变动时间设为压缩时候的时间
  • -x 指定不要处理.zip压缩文件中的哪些文件
  • -i 只压缩符合条件的文件
  • -F 尝试修复损坏的压缩文件
  • -D 压缩文件内不建立目录名称
  • -A 调整可执行的自动解压缩文件
  • -J 删除可执行文件,留下一个普通的 zip 归档文件
  • -T 检查备份文件内的每个文件是否正确无误
  • -X 解压缩时同时回存文件原来的 UID/GID
  • -y 直接保存符号连接,而非该连接所指向的文件,本参数仅在 UNIX 之类的系统下有效
  • -e 加密
  • -n 不压缩具有特定字尾字符串的文件
  • -h2 显示更多帮助

zip 压缩实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#压缩zip
#将当前文件夹下的所有文件打包成一个 myexample.zip 文件
zip myexample.zip *

#把当前文件夹下所有 my1*.doc 的文件打包成一个 myexample.zip 文件
zip myexample.zip my1*.doc

#把一个文件 abc.txt 和一个目录 dir1 压缩成为 myexample.zip
zip -r myexample.zip abc.txt dir1

#将 /home/Blinux/html/ 这个目录下所有文件和文件夹打包为当前目录下的 myexample.zip
#备注:-q 为安静模式,在压缩的时候不显示指令的执行过程
zip -qr myexample.zip /home/Blinux/html

#添加一个文件到 .zip 文件中
#备注:如果当初并没有把 my32.doc 压在 myexample.zip 里面,现在把它加进去。-g 选项是增加而不要重新产生的意思。
zip -g myexample.zip my32.doc

#将更改过的文件添加到压缩包中
#备注:如果当初 my2*.doc 都已经压缩进 myexample.zip 里面了,但是后来 my2*.doc 中有几个文件有更改,又不想去找出到底是哪些文件更改了,这条命令请系统自行帮助检查,更改过的才更新到压缩,否则就不必动。
zip -u myexample.zip my2*.doc

#删除除 .zip 文件中的指定文件
#备注:如果当初 my18.doc 是压缩在 myexample.zip 中的一个文件,现在这条命令把它从压缩文件中抽走并删掉。-d 是删除的意思。
zip -d myexample.zip my18.doc

4.2 unzip 解压缩

unzip 解压缩主要参数

  • -c 将解压缩的结果显示到屏幕上,并对字符做适当的转换
  • -p 与 -c 参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
  • -l 显示压缩文件内所包含的文件
  • -f 更新现有的文件
  • -t 检查压缩文件是否正确,但不解压
  • -u 与 -f 参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中
  • -z 仅显示压缩文件的备注文字
  • -v 执行时显示详细的信息。或查看压缩文件目录,但不解压
  • -T 将压缩文件内的所有文件的最新变动时间设为解压缩时候的时间
  • -x 指定不要处理 .zip 压缩文件中的哪些文件
  • -d 指定文件解压缩后所要存储的目录
  • -n 解压缩时不要覆盖原有的文件
  • -q 安静模式,执行时不显示任何信息
  • -o 不必先询问用户,unzip 执行后覆盖原有文件
  • -a 对文本文件进行必要的字符转换
  • -j 不处理压缩文件中原有的目录路径
  • -aa 把所有的文件目录当作文本处理
  • -U use escapes for all non-ASCII Unicode
  • -UU 忽略 Unicode 编码字符
  • -C 压缩文件中的文件名称区分大小写
  • -L 将压缩文件中的全部文件名改为小写
  • -X 解压缩时同时回存文件原来的 UID/GID
  • -V 保留 VMS 的文件版本信息
  • -K 保留文件的 setuid/setgid/tacky 属性
  • -M 将输出结果送到 more 程序处理
  • -O 指定字符编码为 DOS,Windows 和 OS/2
  • -I 指定字符编码为 UNIX

unzip 解压缩实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#解压zip
#把文件解压到当前目录下
unzip myexample.zip

#如果要把文件解压到指定的目录下,需要用到-d参数。
unzip -d /temp myexample.zip

#解压的时候,有时候不想覆盖已经存在的文件,那么可以加上 -n 参数 /temp是指定的目录
unzip -n myexample.zip
unzip -n -d /temp myexample.zip

#将压缩文件 myexample.zip 在指定目录 tmp 下解压缩,如果已有相同的文件存在,要求 unzip 命令覆盖原先的文件
unzip -o myexample.zip -d /tmp/

#只看一下 zip 压缩包中包含哪些文件,不进行解压缩
unzip -l test.zip

#查看显示的文件列表还包含压缩比率
unzip -v test.zip

#检查 zip 文件是否损坏
unzip -t test.zip

https://www.jianshu.com/p/1ea9920beecc
https://www.jb51.net/article/138120.htm