与 find 类似,tar 也是一个历史悠久的 UNIX® 工具。所以它的语法也有一点难记:
tar [选项] [文件……] |
这里列出了一些选项。请注意,所有的选项都有其对应的长选项格式,但是您需要自行查看 tar 的man page,因为我们无法在此全部列出。
v:详细模式。列出添加到归档文件或者从归档文件中提取的文件名,或者与 t 选项(见上文)联合使用,输出文件的长列表,而不是短列表。
f <文件名>:创建名为文件名的归档文件,从归档文件文件名中提取文件,或者列出归档文件文件名中的文件。如果省略此参数,默认文件为 /dev/rmt0,这通常是与一个流关联的特殊文件。如果文件参数是 -(短横线),则输入或输出(取决于您是创建归档文件还是从归档文件中提取文件)将关联到标准输入或标准输出。
除了上面列出的几个,还有其它许多许多选项,您可能想要参考一下 tar(1) 中的完整列表。比如非常有用的 d 选项。现在,让我们来看一个例子。您想要将 /shared/images/ 中的全部文件打包成为一个归档文件,并且用 bzip2 压缩成名为 images.tar.bz2 存放在您的主目录中。您就需要输入:
# # 注意:您必须进入您想要创建归档文件的目录! # $ cd /shared $ tar cjf ~/images.tar.bz2 images/ |
正如您看到的,我们在这里使用了三个选项:c 让 tar 知道我们想要创建归档文件,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 选项。
在介绍 tar 命令时,您已经看到了我们对这两个程序的大概描述。与 Windows® 中的 WinZip® 不同,存档和压缩是通过两个不同的工具完成的——tar用于存档,我们现在介绍的另外两个程序用于压缩数据:bzip2 和 gzip。您还可以使用不同的压缩工具,诸如 zip、arj 或者 rar 在 GNU/Linux 下都有相应的工具(但一般很少使用)。
首先,bzip2 是作为 gzip 的替代品编写出来的。前者的压缩率通常较高,但工作时也会需要更多的内存。不过,gzip 仍然用于与先前的系统保持兼容。
gzip [选项] [文件] |
如果没有给出文件名,gzip 和 bzip2 都回从标准输入中取得数据,然后将结果发回标准输出。因此,您可以在管道中使用这两个程序。这两个程序都有一组类似的选项:
现在我们来举几个例子。如果您想要将当前目录中所有以 .txt 结尾的文件使用 bzip2 的最大压缩率压缩,就应该输入:
$ bzip2 -9 *.txt |
您想要将您的图像归档文件与别人分享,但对方没有 bzip2 只有 gzip。您无需先解压缩归档文件,然后再重新压缩。您只需将其解压缩到标准输出,然后使用管道从标准输入压缩,再将输出重定向到新的归档文件中。即:
bzip2 -dc images.tar.bz2 | gzip -9 >images.tar.gz |
您可以输入 bzcat 来代替 bzip2 -dc。gzip 也有类似等价的命令,但命令名是 zcat,而非 gzcat。如果您想要查看压缩文件中的内容而不想解压的话,您还可以对 bzip2 文件使用 bzless,对 gzip 文件使用 zless。给您留个作业,如果要查看压缩文件中的内容,既不许事先解压,也不许使用 bzless 或 zless,您该输入什么命令呢?