如何在 Linux 中使用 tar 压缩和解压缩文件

Tar 不仅仅是一个归档实用程序:tar 具有一些强大的内置功能,可让您在归档文件的同时压缩和解压缩文件。在本文中了解所有相关信息以及更多信息!
什么是 tar 以及如何安装它?
根据 tar 手册(您可以在安装后键入 man tar
来访问),tar 是一个归档实用程序。它支持许多功能,包括在归档文件时即时压缩和解压缩文件。让我们开始安装 tar:
要在基于 Debian/Apt 的 Linux 发行版(如 Ubuntu 和 Mint)上安装 tar,请在终端中执行以下命令:
sudo apt install tar
要在基于 RedHat/Yum 的 Linux 发行版(如 RHEL、Centos 和 Fedora)上安装 tar,请在终端中执行以下命令:
sudo yum install tar
接下来,我们将创建一些示例数据:
mkdir test; cd test
touch a b c d e f
echo 1 > a; echo 5 > e; echo '22222222222222222222' > b

这里我们创建了一个目录 test,并使用 touch
命令在其中创建了六个空文件。我们还在文件 a、e 和 b 中添加了一些数字,但值得注意的是文件 b 具有重复数据,这将压缩得很好。
如果您想了解有关压缩工作原理的更多信息,可以查看我们的文件压缩工作原理?文章。
创建未压缩的存档

tar -hcf all_files.tar *
ls -l | grep -v total | awk '{print $5"tbytes for: "$9}' | sort -n
在这里,我们使用 tar -hcf all_files.tar *
命令创建了一个未压缩的存档。让我们看一下此命令中使用的选项。
首先,我们有 -h
虽然在这种特殊情况下不是必需的,但我强烈建议始终将其包含在您的 tar
命令中。此选项代表取消引用,它将取消引用(或跟随)符号链接,归档和转储它们指向的文件。
接下来我们有 -c
和 -f
选项。请注意,它们只是与 -h
中的 -
一起编写的,即我们不指定另一个 -
,而是将它们标记到另一个简写上选项。快捷方便。
-c
选项代表创建新存档。请注意,默认情况下目录是递归归档的,除非还使用了 –no-recursion 选项。 -f
选项允许我们指定存档的名称。因此它必须在我们的选项链中排在最后(因为它需要一个选项)所以我们可以直接在它后面添加存档文件名。使用 tar -fch test.tar *
将不起作用:

生成 tar 后,我们使用修改后的 ls
输出,它清楚地显示了每个文件的字节数。如您所见,tar 文件比我们所有文件的总和要大得多。这些文件只是被归档,并且添加了 tar 的一些总体开销。
作为一个有趣的旁注,我们还可以通过在命令提示符下简单地使用 file
命令来查看正在处理的文件类型:
file c
file b
file all_files.tar

创建未压缩的存档
一种非常常见的压缩算法是 GZIP。让我们将相同的选项 (-z
) 添加到我们的速记命令行选项链中,看看它如何影响文件大小:
tar -zhcf all_files.tar.gz [a-f]
ls -l | grep -v total | awk '{print $5"tbytes for: "$9}' | sort -n

这次我们指定了一个正则表达式只使用名称为 a 到 f 的文件,防止 tar
命令包含 all_files .tar
文件在新的 all_files.tar.gz
文件中!
看看你实际上是如何使用正则表达式的?和使用 sed 使用正则表达式修改文本如果您想了解有关正则表达式的更多信息。
我们还包含了 -z
选项,该选项将在数据转储完成后使用 GZIP 压缩来压缩生成的 .tar
文件。很高兴看到我们最终得到一个 186 字节的文件,这告诉我们 - 在这种情况下 - 大约 10Kb 的 tar
标头/开销可以压缩得很好。
存档的总大小是文件总大小的 7.44 倍,但这无关紧要,因为这个虚构的例子并不代表压缩大文件,在大文件中几乎总是看到收益而不是损失,除非数据是预压缩的或这种格式无法使用各种算法轻松压缩。尽管如此,对于不同的数据集,一种算法(如 GZIP 算法)可能优于另一种算法(如 BZIP2),反之亦然。
使用高级压缩获得更多字节
我们可以使文件更小吗?是的。我们可以通过使用 -I
选项来设置 GZIP 的最大压缩选项 tar
这让我们可以指定要使用的压缩程序(感谢 stackoverflow 用户 ideasman42):
tar -I 'gzip -9' -hcf all_files.tar.gz [a-f]
ls -l | grep -v total | awk '{print $5"tbytes for: "$9}' | sort -n

这里我们指定 -I gzip -9
作为要使用的压缩程序,我们删除了 -z
选项(因为我们现在指定要使用的特定自定义程序而不是使用内置的 tar GZIP 配置)。结果是,由于 GZIP 进行了更好(但通常更慢)的压缩尝试(在级别 -9
),我们少了 12 个字节。
一般来说,压缩速度越快(压缩尝试级别越低,即 -1
),文件大小就越大。而且,压缩越慢(压缩尝试级别越高,即 -9
),文件越小。您可以通过将压缩级别从 -1
(快)更改为 -9
(慢)来设置您自己的偏好
其他压缩程序
还有另外两种常见的压缩算法可供探索和测试(不同的算法选项也会给出不同的大小调整结果,并且可能有额外的压缩选项),那就是 bzip2,可以通过指定-j
选项到 tar
,以及可以通过指定 -J
选项使用的 XZ。
或者,您可以使用 -I
命令为 bzip2
(-9
) 设置最大压缩选项:

-9e
用于 xz
:

如您所见,在这种情况下,结果不如使用比较标准的 GZIP 算法好。尽管如此,bzip2
和 xz
算法可能会显示出与其他数据集的改进。
解压缩文件
解压缩文件非常容易,无论原始压缩方法是什么,只要您的计算机上存在这种压缩算法。例如,如果原始压缩算法是 bzip2(由 tar 文件名的 .bz2
扩展名表示),那么您将希望完成 sudo apt install bzip2
(或sudo yum install bzip2
) 在目标计算机上,用于解压缩文件。
rm a b c d e f
tar -xf all_files.tar.gz
ls

我们只需指定 -x
来展开 或解压缩我们的 all_files.tar.gz
文件,并再次使用 指示文件名是什么>-f
和以前一样的速记选项。
压缩文件可以帮助您在存储设备上节省大量空间,了解如何将 tar
与可用的压缩选项结合使用将有助于您做到这一点。一旦需要再次提取档案,只要在用于从档案中解压缩或提取数据的计算机上安装了正确的解压缩软件,就很容易做到这一点。 尽情享受吧!