存档和数据压缩

tar:磁带存档器

find 类似,tar 也是一个历史悠久的 UNIX® 工具。所以它的语法也有一点难记:

tar [选项] [文件……]

这里列出了一些选项。请注意,所有的选项都有其对应的长选项格式,但是您需要自行查看 tarman page,因为我们无法在此全部列出。

[Note]注意

如果要在 tar 命令中使用短选项,那么请不要在选项前面添加短横线(-),除非是跟在长选项之后。

  • c:此选项用于创建新的归档文件。

  • x:此选项用于从已有的归档文件中提取文件。

  • t:列出已有归档文件中的文件。

  • v:详细模式。列出添加到归档文件或者从归档文件中提取的文件名,或者与 t 选项(见上文)联合使用,输出文件的长列表,而不是短列表。

  • f <文件名>:创建名为文件名的归档文件,从归档文件文件名中提取文件,或者列出归档文件文件名中的文件。如果省略此参数,默认文件为 /dev/rmt0,这通常是与一个关联的特殊文件。如果文件参数是 -(短横线),则输入或输出(取决于您是创建归档文件还是从归档文件中提取文件)将关联到标准输入或标准输出。

  • z:通知 tar 要创建的归档文件应该用 gzip 压缩,或者要提取的归档文件是用 gzip 压缩的。

  • j:与 z 选项相同,但用于压缩的程序是 bzip2

  • p:当从归档文件中提取文件时,保留全部文件属性,包括所有者关系、上次访问时间等等。适合文件系统转存。

  • r:将命令行上列出的文件列表追加到已有归档文件中。请注意,您要追加到的归档文件必须没有被压缩!

  • A:将命令行上给出的归档文件追加到通过 f 选项提交的归档文件中。与 r 选项类似,归档文件必须没有被压缩。

除了上面列出的几个,还有其它许多许多选项,您可能想要参考一下 tar(1) 中的完整列表。比如非常有用的 d 选项。现在,让我们来看一个例子。您想要将 /shared/images/ 中的全部文件打包成为一个归档文件,并且用 bzip2 压缩成名为 images.tar.bz2 存放在您的主目录中。您就需要输入:

 #
 # 注意:您必须进入您想要创建归档文件的目录!
 #
$ cd /shared
$ tar cjf ~/images.tar.bz2 images/

正如您看到的,我们在这里使用了三个选项:ctar 知道我们想要创建归档文件,j 让其用 bzip2 进行压缩,而 f ~/images.tar.bz2 代表归档文件将会创建在主目录中,其名称为 images.tar.bz2。我们现在来看看新创建的归档文件是否可靠。比如我们可以列出其文件列表:

 #
 # 现在让我们回到主目录
 #
$ cd
$ tar tjvf images.tar.bz2

我们在这里通知 tar 列出(t)归档文件 images.tar.bz2(f images.tar.bz2)中的文件,并且事先通知该归档文件已经用 bzip2 压缩了(j),我们还想获得长列表(v)。现在,假设您不小心删掉了 images 目录。所幸您还有归档文件,而您可以通过将其中的文件提取到原来的位置 /shared 加以恢复。但是,由于您不想打乱您先前创建的用于查找新图像的 find 命令,您需要保留全部文件属性:

 #
 # 转到您想要存放提取后文件的目录
 #
$ cd /shared
$ tar jxpf ~/images.tar.bz2

这样就行了!

接下来,我们假定您想要从归档文件中提取 images/cars 目录,没有别的附加功能。您可以输入:

$ tar jxf ~/images.tar.bz2 images/cars

如果您想要备份特殊文件,tar 能够识别这些文件的特殊性,而不会转存其中的内容。所以,您可以安全地将 /dev/mem 放在归档文件中。它还能够正确处理链接,所以也不用担心这个问题。对于符号链接,请查阅 manpage 中的 h 选项。

bzip2 和 gzip:数据压缩程序

在介绍 tar 命令时,您已经看到了我们对这两个程序的大概描述。与 Windows® 中的 WinZip® 不同,存档和压缩是通过两个不同的工具完成的——tar用于存档,我们现在介绍的另外两个程序用于压缩数据:bzip2gzip。您还可以使用不同的压缩工具,诸如 ziparj 或者 rarGNU/Linux 下都有相应的工具(但一般很少使用)。

首先,bzip2 是作为 gzip 的替代品编写出来的。前者的压缩率通常较高,但工作时也会需要更多的内存。不过,gzip 仍然用于与先前的系统保持兼容。

这两个命令的语法基本相同:

gzip [选项] [文件]

如果没有给出文件名,gzipbzip2 都回从标准输入中取得数据,然后将结果发回标准输出。因此,您可以在管道中使用这两个程序。这两个程序都有一组类似的选项:

  • -1,……,-9:设置压缩比率。数字越高,代表压缩后的文件越小,但压缩速度也会越慢。

  • -d:解压缩文件。这等同于 gunzipbunzip2

  • -c:将压缩/解压缩给定文件的结果转存作为标准输出的参数。

[Warning]警告

默认情况下,如果您不使用 -c 选项,gzipbzip2 都会删除压缩前的文件。您可以在 bzip2 中使用 -k 选项来禁止这一特性。gzip 没有类似的选项。

现在我们来举几个例子。如果您想要将当前目录中所有以 .txt 结尾的文件使用 bzip2 的最大压缩率压缩,就应该输入:

$ bzip2 -9 *.txt

您想要将您的图像归档文件与别人分享,但对方没有 bzip2 只有 gzip。您无需先解压缩归档文件,然后再重新压缩。您只需将其解压缩到标准输出,然后使用管道从标准输入压缩,再将输出重定向到新的归档文件中。即:

bzip2 -dc images.tar.bz2 | gzip -9 >images.tar.gz

您可以输入 bzcat 来代替 bzip2 -dcgzip 也有类似等价的命令,但命令名是 zcat,而非 gzcat。如果您想要查看压缩文件中的内容而不想解压的话,您还可以对 bzip2 文件使用 bzless,对 gzip 文件使用 zless。给您留个作业,如果要查看压缩文件中的内容,既不许事先解压,也不许使用 bzlesszless,您该输入什么命令呢?