Contents

UNIX命令压缩和解压缩文件

1. 概述

压缩和解压缩文件和文件夹以及检查和存储它们是我们经常需要通过命令行执行的常见操作。在没有 GUI 的服务器上工作时尤其如此。

在本动手教程中,我们将学习在 Unix 环境中从 CLI(命令行界面)存储、压缩、检查和提取文件和文件夹的不同方法。

2. 探索主要档案格式

在跳转到命令之前,快速浏览一下最流行的存档格式可能会很有用。

2.1. Tar – 第一个归档工具

Tar ( Tape Archive ) 是四十多年前诞生的实用程序,用于在磁带上高效地写入多个文件。它只是将多个文件存储在同一个文件中,而不进行任何压缩。生成的存档文件更易于使用、存储和传输,称为tarball

2.2. Zip 和 GZip – 第一个流行的压缩实用程序

在不深入挖掘历史的情况下(例如,我们会在其中找到compress ),让我们简单地从Zip 开始,它是几十年来最著名的压缩软件。

以有效节省磁盘空间为特定目标,其最常见的压缩方案是deflate LZ77 算法的商业实现。使用 Zip 压缩的文件以.zip扩展名结尾,如archive.zip

由于 Zip 的专有性质,GZip 由 Unix 社区创建,作为在自由软件中使用deflate的替代方案。

不过,GZip 只压缩文件,而不归档它们;为了压缩多个文件,我们需要首先创建一个 tarball,获得一个archive.tar,然后使用 GZip 压缩该 tarball,以一个archive.tar.gz结尾。

2.3. 7-Zip – 现代高效的工具

7-Zip 是一种流行的工具,近年来发展势头强劲,这要归功于它非常高效、跨平台、几乎完全开源(除了处理专有格式 RAR 的部分)。它可以处理除自己的7z 之外的许多不同的存档格式,它基于 LZMA 和 LZMA2 算法并创建扩展名为 .7z 的文件,如archive.7z

2.4. BZip2、Lzip、XZ 等

这些年来,出现了许多压缩工具和存档格式。

每一个都基于不同的压缩算法并有自己的特点,比较它们不在本教程的范围内。

它们的使用是 CPU、磁盘空间或时间消耗之间的权衡,必须根据我们的具体需求进行选择。

现在,让我们知道Tar 允许我们在其中选择压缩一个 tarball,正如我们在 GZip 中看到的那样,BZip2 文件以*.tar.bz2*结尾,Lzip 文件以 .tar.lz 结尾,XZ 文件以在 .tar.xz 中,依此类推。

3. 存储文件和文件夹

现在让我们看看如何将文件存储到存档中,无需任何压缩,但速度最快:

3.1. 创建一个压缩包

我们可以使用以下语法创建包含特定文件和文件夹的 tarball:

tar cf archive.tar file1 dir1 file2 dir2

目录遍历是递归的,这意味着默认情况下将包含子文件夹及其文件。

如果我们想要归档当前目录中存在的所有文件和文件夹,我们可以简单地执行以下操作:

tar cvf archive.tar *

选项v在处理元素时详细打印出元素的名称。

值得知道的是,虽然历史上没有任何符号,但Tar 选项也可以用起始连字符表示

tar -cvf archive.tar *

如果我们想将选项放在不与tar命令相邻的位置,这很有用(并且是强制性的)。

3.2. 创建未压缩的 Zip 存档

虽然不太常见,但我们可能想要存储一个未压缩的 Zip,我们可以通过指定*-0*压缩比标志来做到这一点:

zip -0 archive.zip file1 dir1 file2 dir2

与 Tar 不同的是,Zip 默认不会遍历目录;我们必须为此使用*-r*标志:

zip -0 -r archive.zip *

默认情况下它将是详细的,如果我们想将其静音,我们可以使用*-q*标志。

3.3. 使用 7-Zip 创建未压缩的存档

正如我们在文档中 看到的那样,7-Zip 允许我们以我们之前见过的几乎每一种格式创建档案。

如果我们使用的压缩格式支持 storage-only 选项,我们可以使用 7-Zip 创建一个未压缩的存档,如下所示:

7z a -mx=0 archive.7z file1 dir1 file2 dir2

或者简单地说:

7z a -mx=0 archive.7z *

7-Zip 档案默认包含子文件夹。

4. 压缩文件和文件夹

现在让我们看看如何使用默认压缩设置有效地压缩文件和文件夹。

4.1.压缩压缩包

我们可以使用默认压缩方法GZip轻松压缩 tarball ,只需将z标志添加到存档创建命令并使用正确的存档扩展名:

tar czvf archive.tar.gz *

大写的Z将转而使用非常古老的基于 LZW 的压缩软件:

tar cZvf archive.tar.gz *

可以选择其他格式及其特定标志:

tar cvf --xz archive.tar.xz *
tar cvf --lzip archive.tar.lz *
tar cvf --lzma archive.tar.xz *

最后,** a标志允许 Tar 从文件扩展名中检测压缩机制**:

tar cavf archive.tar.xz *

4.2. 创建压缩的 Zip 存档

从 CLI创建 Zip非常简单:

zip archive.zip *

如前所述,子文件夹可以包含在:

zip -r archive.zip *

4.3. 使用 7-Zip 创建压缩存档

7-Zip 创建压缩存档的语法也很容易记住:

7z a archive.7z *

5. 检查档案

5.1. 检查压缩包

如果我们想检查 tarball 的内容,语法是:

tar tf archive.tar

这也适用于压缩存档:

tar tf archive.tar.gz

5.2. 使用 UnZip 检查 Zip

如果是 Zip,我们可以通过 UnZip 来实现:

unzip -v archive.zip 

5.3. 使用 7-Zip 检查档案

最后,使用 7-Zip 列出存档内容的语法是:

7z l archive.7z

6. 提取文件和文件夹

现在让我们探索提取档案的不同命令。

6.1. 解压压缩包

无论tarball是否被压缩,我们都可以提取文件和文件夹如下:

tar xvf archive.tar
tar xvf archive.tar.gz
tar xvf archive.tar.xz

如果我们想将文件提取到与当前目录不同的目录中,我们可以利用C标志:

tar xvf archive.tar -C targetPath

6.2. 解压缩 Zip 存档

使用 UnZip,从 Zip 存档中提取文件和文件夹是一项非常简单的操作:

unzip archive.zip

我们甚至可以省略扩展名,例如:

unzip archive

tar类似,我们可以使用d标志定位不同的目录:

unzip archive -d targetPath

6.3. 使用 7-Zip 解压缩档案

在保留原始目录结构的同时提取存档的正确语法是:

7z x archive.7z

如果我们想要一个平面提取,其中每个文件和目录都将放在提取文件夹的根目录中,我们可以使用e标志:

7z e archive.7z

同样,7-Zip 需要o标志来指定目标路径(之间没有空格):

7z x archive.7z -o targetPath

7. JAR:边缘案例的替代方案

除了之前看到的情况,我们最终可能会在一台安装了 Java 并且没有其他可用归档软件的机器上结束。 如果是这种情况,我们应该记住,也可以使用 JAR ( J ava Ar cive) 提取存档,按照StackExchange Q&A

jar -xf archive.zip