跳转至

压缩、打包与解压缩

约 574 个字 84 行代码 预计阅读时间 3 分钟

压缩比

压缩比 = 压缩后大小 / 压缩前大小

越低越好。

一般来说,压缩比越低,压缩和解压的耗时越长。

压缩、打包文件常用的扩展名

  • .zipzip 程序压缩的文件
  • .gzgzip 程序压缩的文件
  • .bz2bzip2 程序压缩的文件
  • .xzxz 程序压缩的文件
  • .tartar 程序打包的文件,未压缩
  • .tar.gz.tar.bz2.tar.xztar 程序打包,并经过上述程序压缩的文件

zip

兼容性最佳,但是压缩比高。

Ubuntu 中自带解压程序,但压缩程序要另下。

# 打包文件 / 添加文件到压缩包
zip 压缩文件.zip 文件1 文件2 ...

# 打包目录,包含其中的文件
zip -r 压缩文件.zip 目录1 目录2 ...

# 删除压缩包里面的文件
zip -d 压缩文件.zip 路径

# 列出压缩包里面的文件
zip -sf 压缩包.zip # 只是列出文件
unzip -l 压缩包.zip    # 还有其他信息

# 解压缩到当前目录
unzip 压缩包.zip

# 解压缩到特定目录(目录不存在则会自动创建)
unzip 压缩包.zip -d 路径

压缩时,压缩文件内的路径按照输入的源文件路径确定,解压缩会使用。见下例:

ding@ding-server:~$ zip -r s.zip /etc/systemd
...
  adding: etc/systemd/ (stored 0%)
  adding: etc/systemd/journald.conf (deflated 48%)
...

ding@ding-server:~$ unzip -l s.zip
Archive:  s.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2022-05-07 09:39   etc/systemd/
     1042  2020-04-22 17:04   etc/systemd/journald.conf
      642  2022-04-14 11:49   etc/systemd/resolved.conf
...
ding@ding-server:~$ cd /etc/
ding@ding-server:/etc$ zip -r ~/s2.zip systemd
...
  adding: systemd/ (stored 0%)
  adding: systemd/journald.conf (deflated 48%)
...
ding@ding-server:~$ cd ~
ding@ding-server:/etc$ unzip -l s2.zip 
Archive:  s2.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2022-05-07 09:39   systemd/
     1042  2020-04-22 17:04   systemd/journald.conf
      642  2022-04-14 11:49   systemd/resolved.conf
...

gzip / bzip2 / xz

Linux 中三种常见的压缩格式。

gzip

# 压缩文件,不保留源文件,输出的文件名是原文件名加上 .gz
gzip 文件

# 压缩文件,保留(keep)源文件
gzip -k 文件

# 解压(decompress)文件,不保留压缩文件
gzip -d 压缩文件.gz

# 查看压缩文件内容
zcat 压缩文件.gz
zmore 压缩文件.gz
zless 压缩文件.gz

# 在压缩文件中查找特定文本
zgrep "要查找的文本" 压缩文件.gz

bzip2 / xz

用法大同小异。

扩展名 压缩 / 解压缩 cat more less grep
.gz gzip zcat zmore zless zgrep
.bz2 bzip2 bzcat bzmore bzless bzgrep
.xz xz xzcat xzmore xzless xzgrep

压缩比:gzip > bzip2 > xz

耗时:gzip < bzip2 < xz

tar

打包

概念

  • tarfile:仅经过 tar 打包,未压缩的文件
  • tarball:经过 tar 打包和压缩的文件

打包与压缩

1
2
3
4
tar -cv -f 包.tar 文件或目录1 文件或目录2 ... 
tar -zcv -f 压缩包.tar.gz 文件或目录1 文件或目录2 ... 
tar -jcv -f 压缩包.tar.bz2 文件或目录1 文件或目录2 ... 
tar -Jcv -f 压缩包.tar.xz 文件或目录1 文件或目录2 ... 

选项: - -z / -j / -J:压缩方式,分别为 gzip / bzip2 / xz - -c:建立打包文件(create) - -v:过程中将处理的文件名显示出来(verbose) - -f 文件名:定义文件名;f 也可以跟在前面的参数后面,但要保证 f 后面是空格和文件名(如 -zcvf 压缩包.tar.gz) - -p:保留数据的原本权限、属性,常用于备份重要的配置文件 - --exclude=路径:压缩过程中,不要打包指定文件(路径的格式要和要压缩的文件的路径格式一致,且要写在要压缩的文件之前)

查询

-t:查询(list

1
2
3
4
ding@ding-server:~$ tar -t -f etc/systemd/
etc/systemd/gpg-agent-ssh.socket
etc/systemd/resolved.conf

-v:显示详细信息(verbose)

1
2
3
4
ding@ding-server:~$ tar -tv -f drwxr-xr-x root/root         0 2022-05-07 09:39 etc/systemd/
lrwxrwxrwx root/root         0 2022-02-23 16:54 etc/systemd/gpg-agent-ssh.socket -> /usr/lib/systemd/user/gpg-agent-ssh.socket
-rw-r--r-- root/root       642 2022-04-14 11:49 etc/systemd/resolved.conf

也可以加上压缩方式的选项。

解包与解压缩

1
2
3
4
5
6
7
8
# 解包到当前路径
tar -x -f 
# 仅解开单一文件
tar -xv -f  要解开的文件

# 解包到指定路径;路径必须存在
tar -xv -f  -C 要解压到的路径

选项:

  • -x:解包文件(extract)
  • -v:过程中将处理的文件名显示出来(verbose)

也可以加上压缩方式的选项。

参考资料

  • 鸟哥的Linux私房菜. 基础学习篇 / 鸟哥著 ; Linux 中国繁转简. -- 4版. -- 北京 : 人民邮电出版社, 2018.3; ISBN 978-7-115-47258-8
  • Linux就该这么学 / 刘遄著. -- 北京 : 人民邮电出版社, 2017.11; ISBN 978-7-115-47031-7
  • Linux 教程 | 菜鸟教程