系统管理员和开发人员的 15 个 tar 命令示例
已发表: 2021-09-21tar 是 Unix 和基于 Linux 的系统中可用的流行文件归档格式之一。
该名称本身源自T ape AR chive,因为它是为在磁带设备上写入顺序数据而开发的。 它有时也被称为 tarball。
默认情况下,tar 只存档文件而不压缩,但使用某些部分。 我们可以使用不同的压缩技术来获得压缩输出。 tar 实用程序通常默认包含在大多数 Linux 发行版中,并且通过不同的工具和实用程序,其他操作系统(包括 Windows 和 macOS)都支持该格式本身。
我们将在本文中介绍 tar 命令及其支持的标志的一些常见示例和用法。
那么让我们开始吧……
创建 tar 存档
要创建一个简单的未压缩存档, tar命令的语法是:
$ tar cvf <tar-file-name> <files-to-archive> 这里的标志c代表创建, v代表详细输出, f代表指定 tar 存档文件名。 按照惯例,指定带有.tar扩展名的 tar 文件名。 要存档的文件可以使用通配符或单个或多个文件名/路径指定。
例如,我的目录中有三个文件:
$ ls -l total 12 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $ 我想创建一个包含所有三个文件的tar存档,可以这样做:
$ tar cvf archive.tar * file1.txt file2.txt file3.txt $ ls -l archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar $我也可以仅指定要存档的特定文件,例如:
$ tar cvf archive1.tar file1.txt file2.txt file1.txt file2.txt $ ls -l archive1.tar -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive1.tar $创建压缩档案 (GZ)
tar 不仅可以存档文件,还可以压缩它们以节省空间。 一个流行的压缩格式是gunzip解,通常是由扩展表示.gz后.tar或作为tgz 。 我们可以使用z标志来指定我们需要使用 gunzip 压缩的文件。 下面是一个例子:
$ tar cvzf archive.tar.gz file* file1.txt file2.txt file3.txt $ ls -l archive.tar archive.tar.gz -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz $ 您可以观察到两个存档文件的大小有很大不同,即使它们都包含相同的三个文件。 这是由于使用z标志进行压缩。
创建压缩档案 (BZ2)
tar 支持其他几种压缩格式。 其中之一是bz2或bzip2 ,由扩展名tar.bz2或有时表示为tbz2 。 它可能会为您提供更小的存档大小,但反过来会消耗更多的 CPU,因此压缩/解压缩的过程可能比gz存档慢。
例子:
$ tar cvjf archive.tar.bz2 file* file1.txt file2.txt file3.txt $ ls -l archive.tar archive.tar.gz archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 12 20:25 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz $ file archive.tar* archive.tar: POSIX tar archive (GNU) archive.tar.bz2: bzip2 compressed data, block size = 900k archive.tar.gz: gzip compressed data, from Unix, original size modulo 2^32 10240 $解压所有文件
使用x选项可以简单地提取 tar 存档(无论是压缩的还是未压缩的)。 下面的例子将阐明它的用法:
$ tar xvf archive.tar file1.txt file2.txt file3.txt $ ls -l total 24 -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 19 18:25 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $ 这适用于gz压缩存档:
$ tar xvf archive.tar.gz file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 19 18:27 archive.tar.gz -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $ 或者甚至对于bz2压缩存档为:
$ tar xvf archive.tar.bz2 file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $列出 tar 内容
要列出 tar 存档的内容,您可以使用t标志,如下所示:
$ tar tvf archive.tar.bz2 -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $解压特定文件
只有一个文件可以从提取tar或tar.gz或tar.bz2通过指定文件名作为档案:
$ tar xvf archive.tar.bz2 file1.txt file1.txt $ ls -l total 8 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt $同样,您可以指定多个以空格分隔的文件名,以一次性提取它们。
$ tar xvf archive.tar.bz2 file1.txt file3.txt file1.txt file3.txt $ ls -l total 12 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $使用通配符解压
要使用通配符PATTERN提取一个或多个文件,请使用--wildcards标志:
$ tar xvf archive.tar.bz2 --wildcards "file*" file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $将文件添加到存档
通过使用r或--append标志和新文件名或通配符模式,可以将新文件添加/附加到现有的未压缩 tarball(请记住,这只适用于未压缩的.tar文件,不适用于tar.gz或tar.bz2压缩格式):

$ tar rvf archive.tar file-new* file-new.txt file-new2.txt $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt $ 您可以观察到archive.tar列表内容再次显示了两个新添加的文件。
从存档中删除文件
可以使用--delete标志从 tar 存档中删除特定文件,如下所示(比较文件删除前后的 tar 列表):
$ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt $ tar --delete -f archive.tar file-new.txt file-new2.txt $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt $同样,这仅适用于未压缩的 tarball,对于压缩存档格式将失败。
使用验证创建
在创建未压缩的 tar 文件时,您可以使用W标志验证存档的内容:
$ tar cvfW archive.tar file*.txt file1.txt file2.txt file3.txt Verify file1.txt Verify file2.txt Verify file3.txt $ 这不能与压缩标志一起使用,尽管您可以稍后使用gzip或其他工具压缩创建的tar文件。
解压tar到文件夹
如果要将 tarball 内容解压缩到特定文件夹而不是当前目录,请使用-C标志和目录路径,如下所示:
$ tar xvf archive.tar -C new-directory/ file1.txt file2.txt file3.txt file2.txt file4.txt $ ls -l new-directory/ total 16 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 15 Sep 19 18:59 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt -rw-r--r-- 1 abhisheknair abhisheknair 10 Sep 19 18:58 file4.txt $使用差异标志
您可以使用--diff或d标志来查找 tar 存档中的文件与文件系统中的文件之间的任何更改。 这是一个示例,当 tar 内部和外部的文件相同时,该示例运行一次diff 。 更新文件后,它再次运行以显示输出的差异。
$ tar dvf archive.tar file4.txt file4.txt $ $ echo newline > file4.txt $ $ tar dvf archive.tar file4.txt file4.txt file4.txt: Mod time differs file4.txt: Size differs $排除文件
创建 tar 存档时可能需要排除特定文件。 这可以通过--exclude标志来实现。
$ tar --exclude="dir/file2.txt" --exclude="dir/file-new*.txt" -cvzf archive.tar.gz dir/ dir/ dir/file1.txt dir/file3.txt $ ls -l dir total 24 -rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new.txt -rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new2.txt -rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:20 file-new3.txt -rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:27 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 6 Sep 19 19:27 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 8 Sep 19 19:27 file3.txt $ tar tvf archive.tar.gz drwxr-xr-x abhisheknair/abhisheknair 0 2021-09-19 19:30 dir/ -rw-r--r-- abhisheknair/abhisheknair 5 2021-09-19 19:27 dir/file1.txt -rw-r--r-- abhisheknair/abhisheknair 8 2021-09-19 19:27 dir/file3.txt $ 从上面的输出中可以看出,我们可以多次指定--exclude标志以在AND条件下指定多个文件名或模式。 请注意,在上述示例中dir中的六个文件中,只有两个文件满足要包含在archive.at.gz的条件。
查看 tar 内容大小
我们可以使用以下命令获取压缩 tar 存档内容的大小:
$ tar tvf archive.tar.gz -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $ tar -xzf archive.tar.gz --to-stdout|wc -c 56 $ 同样对于bz2存档:
$ tar tvf archive.tar.bz2 -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $ tar -xjf archive.tar.bz2 --to-stdout|wc -c 56 $保留权限
默认情况下, tar命令保留正在归档的文件和目录的权限,但您可以使用-p标志或--preserve-permissions明确指定相同--preserve-permissions ,如下所示:
$ tar cvpzf archive.tar.gz *.txt file1.txt file2.txt file3.txt $概括
tar 长期以来一直是 Unix/Linux 系统上的有用实用程序,主要用于归档和备份任务。 随着时间的推移,该实用程序已经发展出许多选项。 它可以用于从简单到复杂的任务,前提是您知道它提供的功能。 本文介绍了您可以使用tar命令执行的一些基本操作,并展示了它如何帮助您完成日常系统管理任务。
请参阅其手册页man tar或使用tar --help或tar --usage命令以获取更多详细信息。
