15个tar命令示例,适用于系统管理员和开发人员

tar是Unix和Linux系统中常用的文件归档格式之一。

名称来源于Tape ARchive,它最初是为了在磁带设备上写入顺序数据而开发的。有时也称为tarball。

默认情况下,tar仅归档文件而不进行压缩,但是可以使用不同的压缩技术来获得压缩的输出。tar实用程序通常默认包含在大多数发行版中,并且该格式也通过不同的工具和实用程序在其他操作系统中得到支持,包括Windows和macOS。

本文将介绍tar命令及其支持的标志的一些常见示例和用法。

让我们开始吧…

创建tar归档

要创建一个简单的未压缩归档,tar命令的语法如下:

$ tar cvf  

这里的标志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,通常在.tar之后表示为.gz扩展名,或者表示为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支持其他几种压缩格式。其中之一是bz2bzip2,其表示为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
$

解压特定文件

可以通过指定文件名来从tartar.gztar.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标志将新文件添加/追加到现有的未压缩tar文件中,其中包括新文件名或通配符模式(请记住,这仅适用于未压缩的.tar文件,并且不能用于tar.gztar.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
$

同样,这仅适用于未压缩的tar文件,对于压缩的存档格式将无法成功。

创建并进行验证

在创建未压缩的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标志

您可以使用--diffd标志在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显式指定相同的权限,如下所示:

$ tar cvpzf archive.tar.gz *.txt
file1.txt
file2.txt
file3.txt
$

总结 👨‍💻

tar是Unix/Linux系统上一个有用的实用工具,长期以来主要用于归档和备份任务。该实用工具随着时间的推移而发展了许多选项。它可以用于简单到复杂的任务,只要您了解其提供的功能。本文介绍了一些可以使用tar命令执行的基本操作,并展示了它如何帮助您在链接_1中使用。

请参阅其手册页man tar,或使用tar --helptar --usage命令获取更多详细信息。

类似文章