王美洁

1.11 压缩与解压

我想“压缩文件”这件事你并不陌生。

在 Windows 里,很多同学最熟悉的是:

  • zip
  • rar

但在 Linux 里,更常见的是:

  • tar
  • tar.gz
  • tar.xz

这里先说一个很重要的点:

tar 严格来说最早不是“压缩工具”,而是“打包工具”。

你可以先把它理解成:

  • 先把很多文件和目录打成一个包
  • 再选择要不要顺手压缩

所以你以后看到:

  • .tar
  • .tar.gz
  • .tgz

不要把它们完全当成和 Windows 里单纯的压缩包一模一样的概念。
它们往往带着“先打包,再压缩”的思路。

在科研环境里,tar 很常见,因为我们经常会遇到这些场景:

  • 一个结果目录里有很多文件,要整体打包
  • 需要把整个计算目录传到别的服务器或发给别人
  • 下载到一个源码包,需要先解压再编译
  • 备份老结果,减少零散文件数量

1. 最小用法

最常见的两条命令是:

bash
tar -czvf dir.tar.gz dir # 将目录压缩成 tar.gz
tar -xzvf dir.tar.gz     # 解压 tar.gz 文件

如果你现在完全是新手,先把这两条记住就够了。

2. tar 详细用法

很多同学一开始会觉得 tar -czvf 这种写法很像一串咒语。

其实它只是把几个参数连着写在一起。

bash
tar -czvf dir.tar.gz dir

这里可以拆成:

  • c = create,创建一个新包
  • z = gzip,打包后顺手用 gzip 压缩
  • v = verbose,显示处理过程
  • f = file,后面要跟输出文件名

所以这条命令整体可以先理解成:

dir 打包,并且用 gzip 压缩,输出成 dir.tar.gz,同时把过程打印出来。

对应地:

bash
tar -xzvf dir.tar.gz

可以拆成:

  • x = extract,解包
  • z = gzip,说明这是一个 gzip 压缩过的包
  • v = verbose,显示解压过程
  • f = file,后面跟输入文件名

也就是:

dir.tar.gz 解开,并把过程打印出来。

4. 最常见的几个变体

只打包,不压缩

bash
tar -cvf results.tar results/ # 只打包,不做 gzip 压缩

这时生成的是 .tar,不是 .tar.gz

指定解压目录

bash
tar -xzvf results.tar.gz -C /path/to/target # 解压到指定目录

这里的:

  • -C = change directory

可以先理解成“先切到这个目录,再把包解开”。

先看看包里有什么

bash
tar -tvf results.tar.gz # 查看包里包含哪些文件

这里的:

  • t = list

很适合在你不确定包里内容时先看一眼。

3. zipunzip

虽然 Linux 里 tar 很常见,但 zip 也并不是不能用。

如果你和 Windows 用户频繁交换文件,或者希望对方双击就能解压,zip 反而更通用。

最常见的最小用法是:

bash
zip -r results.zip results/ # 递归压缩目录
unzip results.zip           # 解压 zip 文件

这里的:

  • zip:创建 zip 压缩包
  • unzip:解压 zip 压缩包
  • -r:递归压缩目录

你可以先这样理解:

  • tar:Linux / 服务器 / 源码包 / 目录打包场景很常见
  • zip:跨平台交流更方便,Windows 用户通常更熟悉