6.2 用tar归档

tar命令可以用来归档文件。不过,它最初是设计用来将数据存储在磁带上(tape archives, tar)。可以用tar将多个文件和文件夹保存为单个文件,同时还能保留所有的文件属性,如所有者、权限等。由该命令创建的文件通常称为tarball。

6.2.1 预备知识

所有类UNIX操作系统都默认包含tar命令。它的语法简单,并且文件格式具备可移植性。让我们来看看命令的用法。

tar包含一个参数列表:Acdruxfv。其中每一个参数都可以依据不同的用途单独使用。

6.2.2 实战演练

按照下面的语法,用tar对文件进行归档:

  1. $ tar -cf output.tar [SOURCES]

例如:

  1. $ tar -cf output.tar file1 file2 file3 folder1 ..

命令中的 -c代表“创建文件”(creat file),-f代表“指定文件名”(specify filename)。

我们可以使用文件名列表或者诸如 *.txt这类通配符来指定文件夹和文件名作为SOURCES。

上面的命令将原文件归档为单个文件output.tar。

文件名必须紧跟在 -f之后,并且应该是参数组中的最后一项(例如,-cvvf filename.tar-tvvf filename.tar)。

我们不能传递上百个文件或文件夹作为 tar 的参数,毕竟参数数量不是无限制的。如果有很多文件需要归档的话,使用追加(append)选项要更安全些。

6.2.3 补充知识

让我们再来看看tar命令的其他特性。

  • 向归档文件中添加文件

有时候,我们可能需要向已存在的归档文件再添加一些文件(其用例情境包括:当有成百上千个文件需要归档且这些文件又无法作为命令行参数在一行中指定时)。

追加选项:-r

要向已存在的归档文件添加一个文件,可以使用:

  1. $ tar -rvf original.tar new_file

用下面的方法列出归档文件中的内容:

  1. $ tar -tf archive.tar
  2. yy/lib64/
  3. yy/lib64/libfakeroot/
  4. yy/sbin/

如果需要在归档或列出归档内容的过程中获知更多细节,可以使用 -v-vv选项。它们统称为verbose(v),它们允许在终端中输出更详细的信息,借助verbose,你能够打印诸如文件权限、所有者所属组、文件修改日期等细节。

例如:

  1. $ tar -tvvf archive.tar
  2. drwxr-xr-x slynux/slynux 0 2010-08-06 09:31 yy/
  3. drwxr-xr-x slynux/slynux 0 2010-08-06 09:39 yy/usr/
  4. drwxr-xr-x slynux/slynux 0 2010-08-06 09:31 yy/usr/lib64/
  • 从归档文件中提取文件或文件夹

下面的命令将归档文件的内容提取到当前目录中:

  1. $ tar -xf archive.tar

选项-x表示提取(exact)。

使用-x时,tar命令将归档文件中的内容提取到当前目录。我们也可以用选项-C指定需要将文件提取到哪个目录:

  1. $ tar -xf archive.tar -C /path/to/extraction_directory

这个命令将归档文件的内容提取到指定目录中。它提取的是归档文件中的全部内容。我们可以通过将文件名指定为命令行参数来提取特定的文件:

  1. $ tar -xvf file.tar file1 file4

上面的命令只提取file1和file4,同时忽略掉其他文件。

  • tar中使用stdinstdout

进行归档时,我们可以将stdout指定为输出文件,这样另一个命令就可以通过管道将它作为stdin,并进行其他处理或提取内容。

当通过安全shell(Secure Shell,SSH)连接传输数据时,这招很管用。例如:

  1. $ mkdir ~/destination
  2. $ tar -cf - file1 file2 file3 | tar -xvf - -C ~/destination

在上面的例子中,首先对file1、file2和file3进行归档,然后将它们提取到~/destination中。在这个命令中:

  • -f指定stdout作为归档文件(当使用 -c选项时)

  • -f指定stdin用于提取内容(当使用 -x选项时)

  • 拼接两个归档文件

我们可以用 -A选项轻松地合并多个tar文件。

假设我们现在有两个tar文件:file1.tar和file2.tar。我们可以按照下面的方法将file2.tar的内容合并到file1.tar中:

  1. $ tar -Af file1.tar file2.tar

查看内容,验证操作是否成功:

  1. $ tar -tvf file1.tar
  • 通过检查时间戳来更新归档文件中的内容

添加选项可以将指定的任意文件加入到归档文件中。如果同名文件已经存在,那么结果就是在归档文件中包含了两个同名的文件。我们可以用更新选项 -u指明:只有比归档文件中的同名文件更新的时候才进行添加。

  1. $ tar -tf archive.tar
  2. filea
  3. fileb
  4. filec

上面的命令将列出归档文件中的内容。

为了做到只有在filea的文件内容修改时间更新(newer)的时候才对它进行添加,可以使用:

  1. $ tar -uvvf archive.tar filea

如果我们想要追加的filea和归档文件中的filea有相同的时间戳,那么不执行任何操作。

这时可用touch命令修改文件的时间戳,然后再用tar命令:

  1. $ tar -uvvf archive.tar filea
  2. -rw-r--r-- slynux/slynux 0 2010-08-14 17:53 filea

因为时间戳比归档文件中的同名文件更新,因此执行追加操作。

  • 比较归档文件与文件系统中的内容

有时候,如果能够知道归档文件中的文件与文件系统中的同名文件是否有差别,对于我们而言还是有帮助的。选项 -d可以打印出两者之间的差别:

  1. $ tar -df archive.tar filename1 filename2 ...

例如:

  1. $ tar -df archive.tar afile bfile
  2. afile: Mod time differs
  3. afile: Size differs
  • 从归档文件中删除文件

我们可以用 --delete选项从给定的归档文件中删除文件。例如:

  1. $ tar -f archive.tar --delete file1 file2 ..

来看另外一个例子:

  1. $ tar -tf archive.tar
  2. filea
  3. fileb
  4. filec

我们也可以使用下面的语法:

  1. $ tar --delete --file archive.tar [FILE LIST]

例如:

  1. $ tar --delete --file archive.tar filea
  2. $ tar -tf archive.tar
  3. fileb
  4. filec
  • 压缩tar归档文件

tar命令只能用来对文件进行归档,它并不具备压缩功能。出于这个原因,多数用户在使用归档文件时都会对文件采用某种形式的压缩,这样就能够大量降低文件的大小。归档文件通常被压缩成下列格式之一:

  • file.tar.gz

  • file.tar.bz2

  • file.tar.lzma

  • file.tar.lzo

不同的tar选项可以用来指定不同的压缩格式。

  • -j指定bunzip2格式;

  • -z指定gzip格式;

  • --lzma指定lzma格式。

这些格式会在随后专门讲解压缩的攻略中讨论。

可以不明确指定上面那些特定的选项来使用压缩功能。tar可以通过查看输出或输入文件的扩展名来进行压缩。为了让tar支持根据扩展名自动进行压缩,使用 -a--auto-compress选项。

  • 从归档中排除部分文件

通过指定样式可以从归档中排除部分文件。用 --exclude [PATTERN]排除匹配通配符样式的文件。

例如,排除所有的.txt文件:

  1. $ tar -cf arch.tar * --exclude "*.txt"

6.2 用tar归档 - 图1 样式应该使用双引号来引用。

也可以将需要排除的文件列表放入文件中,同时配合选项 -X

  1. $ cat list
  2. filea
  3. fileb
  4.  
  5. $ tar -cf arch.tar * -X list

这样就将fileafileb从归档中排除了。

  • 排除版本控制目录

我们通常使用tar归档文件来分发源代码。大多数源代码都是使用版本控制系统进行维护,如subversiongitmercurialcvs等。版本控制系统中的代码目录包含用来管理版本的特殊目录,如.svn或.git。但源代码本身并不需要这些目录,所以不应该将它们包含在源代码的tar归档文件中。

为了在归档时排除版本控制相关的文件和目录,可以使用tar的 --exclude-vcs选项。例如:

  1. $ tar --exclude-vcs -czvvf source_code.tar.gz eye_of_gnome_svn
  • 打印总字节数

有时候我们需要打印出归档了多少字节。用--totals就可以在归档完成之后打印出总归档字节数:

  1. $ tar -cf arc.tar * --exclude "*.txt" --totals
  2. Total bytes written: 20480 (20KiB, 12MiB/s)

6.2.4 参考

  • 6.4节讲解了gzip命令。

  • 6.5节讲解了bzip2命令。

  • 6.6节讲解了lzma命令。