内容纲要

🗂 | 查看 Linux 专题可浏览更多内容


归档与压缩

你也许已经对如 .zip.rar.7z 这样的压缩文件很熟悉,并可以熟练的使用如 WinZip、WinRAR、BandZip 这样的多功能压缩文件管理工具。

「压缩」就是通过特定的算法来减小计算机文件大小,但你可能还不知道「归档」。

所谓「归档」就是将多个文件和目录组成一个文件的过程。

也就是说这其实是两件事,将多个文件或目录「归档」成一个文件是一回事,而将文件体积进行「压缩」则是另一回事,只是现在许多工具将两件事一气呵成的做到了。

💡 Unix 有一个哲学理念为「只做一件事,并且把它做好!」,也就是说一个工具应该只专注于做一件事。

那么在 Linux 上,归档和压缩是使用什么软件及如何操作的呢?

tar

tar (tape archive) 是类 Unix 系统上最常见最经典的文件归档工具,它最初的用途是备份磁带,当然现在可不仅于此。

打包

$ tar 参数 归档文件名及路径 被归档文件1 [被归档文件2 ...]

假设想把当前目录下的 README.md 打包到当前目录下并命名成 Documents.tar

  • -c 表示创建一个打包文件
  • -f 表示目标文件名
$ tar -cf Documents.tar README.md

打包绝对路径时的提示

在压缩打包绝对路径的包的时候可能会遇到一个报错:

tar: Removing leading `/' from member names

这时候可以使用 -P 参数,且注意这个参数需要在 -f 之前,如:tar -cPf

举个例子,假设想把 /etc 这个目录打包到主目录下,命名为 etc.tar

$ sudo tar -cPf /home/conners/etc.tar /etc

添加新文件到归档文件中

例如,将当前目录下的文件 demo.mp3 添加到当前目录下已有的归档文件 music.tar

# 使用 -r 参数追加文件
$ tar -rf music.tar demo.mp3

查看归档文件中的内容

  • 使用 -t 参数查看归档文件中的内容
  • 可再加上 -v 参数查看如时间、权限、属主等详细内容
# 使用 -t 查看归档文件中的内容
$ tar -tf <文件名>.tar

# 使用 -v 查看详细信息
$ tar -tvf <文件名>.tar

解包

# 在当前目录中解包 <文件名>.tar
$ tar -xf www.tar

# 使用 -C 选项解包到指定目录
$ tar -xf www.tar -C /home/conners

gzip 与 bzip2

gzip 与 gunzip

gzip 程序可以压缩单个或多个文件

$ gzip <目标文件>

# 可以使用 -t -v 选项测试压缩文件的完整性
$ gzip -tv <目标文件>

使用 gzip 命令会使原文件的压缩文件替换原文件。

$ gzip -d <文件名>.gz
$ gunzip <文件名>.gz

使用 gzip-d 选项或 gunzip 命令就可以解压指定的 .gz 压缩文件,同时压缩文件会被原文件替换。

❓ 如果使用 gzip 压缩一个目录会发生什么,首先 gzip 会提示这是一个目录,而如果使用 -r 选项,它会递归压缩目录内的文件,但不是将所有文件打包到一起,而是各自压缩,你可以找个目录试试 -r 选项。

bzip2 与 bunzip2

bzip2 与 gzip 类似,连使用方法也是

# 使用 bzip2 压缩一个文件
$ bzip2 <目标文件>

# 使用 bzip2 解压缩一个文件
$ bunzip2 <文件名>.bz2

bzip2 的用法基本和 gzip 类似(除了 -r 选项)

使用 tar 在打包时连带压缩

在使用 tar 打包时加上 -z 选项就可以在归档时使用 gzip 压缩:

$ tar -czPf <文件名>.tar.gz <被归档压缩文件>

而加上 -j 选项可以在归档时使用 bzip2 压缩:

$ tar -cjPf <文件名>.tar.bz2 <被归档压缩文件>

使用 tar 解包解压缩

# 在当前目录中解压 .tar.gz 文件
$ tar -xzf <文件名>.tar.gz
# 在当前目录中解压 .tar.bz2 文件
$ tar -xjf <文件名>.tar.bz2

# 使用 -C 选项解压缩到指定目录
$ tar -xzf <文件名>.tar.gz -C <解压缩的目标目录>

同样算法但不同后缀名

其实为了简化和传播, gzip 和 bzip2 还有单后缀名格式。如下:

.tar.gz > .tgz
.tar.bz2 > .tbz2

更智能的 -a 选项

gzip 的 -z 选项 bzip2 的 -j 选项,其参数名和自身程序名没有太大关联,让人觉得不直观不好记。

幸好有一个 -a (auto)参数可以智能的根据后缀名自动处理。

提示:

  • -f 表示目标文件名
  • -c 表示创建一个打包文件
  • -x 表示提取一个打包文件
# 归档并使用 gzip 压缩
$ tar -caf <文件名.>tar.gz <被归档文件>

# 归档并使用 bzip2 压缩
$ tar -caf <文件名>.tar.bz2 <被归档文件>

# 解压
$ tar -xaf <文件名>

-c 表示创建 Create,-x 表示提取 Extract,这样再配合 -a 表示自动 Auto 就很好记了。

zip 与 unzip

对于 .zip 文件可以使用 zip 与 unzip 程序。

# 使用 zip 压缩指定文件
$ zip <文件名>.zip <目标文件>

# 如果是目录需要使用 -r 选项递归,否则只保留目录而不包含其内容
$ zip -r <文件名>.zip <目标目录>

还需要注意与 tar 不同的是,如果指定的归档文件已经存在,那么是对其更新而不是替换。

在解压缩 .zip 文件时可以使用 unzip。

$ unzip <文件名>.zip

# 使用 -d 选项解压到目标目录
$ unzip <文件名>.zip -d <指定目录>

unzip 还有一些比较实用的选项,比如 -l 选项可以只查看文件内容而不进行提取文件。

在提取时如果指定文件名可以有选择的只提取指定文件:

$ unzip Documents.zip README/01.md

如上,假设通过 -l 选项知道了 Documents.zip 文件中有一个 README 目录,而我需要其中名为 01.md 的文件,就可以使用如上示例进行提取。