前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux中15个最常用的tar命令,一定有你没用过的!

Linux中15个最常用的tar命令,一定有你没用过的!

作者头像
网络技术联盟站
发布2023-03-13 20:38:51
6.8K0
发布2023-03-13 20:38:51
举报
tar 是 Unix 和基于 Linux 的系统中最常用的文件归档格式之一。

该名称本身源自T ape AR chive,因为它是为在磁带设备上写入顺序数据而开发的,它有时也被称为 tarball

默认情况下,tar 只存档文件而不压缩,但使用某些部分,我们可以使用不同的压缩技术来获得压缩输出,tar 实用程序通常默认包含在大多数Linux发行版中,并且通过不同的工具和实用程序,其他操作系统(包括 Windows 和 macOS)都支持该格式本身。

我们将在本文中介绍 tar 命令。

那么让我们开始吧……

1、创建 tar 存档

要创建一个简单的未压缩档案,tar命令的语法是:

代码语言:javascript
复制
$ tar cvf <tar-file-name> <files-to-archive>

这里的标志c代表创建、v详细输出和f指定 tar 存档文件名。

按照惯例,指定带有.tar扩展名的 tar 文件名,要存档的文件可以使用通配符或单个或多个文件名/路径指定。

例如,我的目录中有三个文件:

代码语言:javascript
复制
$ ls -l
total 12
-rw-r--r-- 1 wljslmz wljslmz 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 wljslmz wljslmz 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 wljslmz wljslmz 24 Sep 12 20:08 file3.txt
$

我想创建一个tar包含所有三个文件的存档,可以这样做:

代码语言:javascript
复制
$ tar cvf archive.tar *
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar
-rw-r--r-- 1 wljslmz wljslmz 10240 Sep 12 20:15 archive.tar
$

我也可以仅指定要存档的特定文件,例如:

代码语言:javascript
复制
$ tar cvf archive1.tar file1.txt file2.txt
file1.txt
file2.txt
$ ls -l archive1.tar
-rw-r--r-- 1 wljslmz wljslmz 10240 Sep 12 20:15 archive1.tar
$

2、创建压缩档案 (GZ)

tar 不仅可以存档文件,还可以压缩它们以节省空间,一个流行的压缩格式是gunzip解,通常是由扩展表示.gz后.tar或作为tgz。

我们可以使用z标志来指定我们需要使用 gunzip 压缩的文件,下面是一个例子:

代码语言:javascript
复制
$ tar cvzf archive.tar.gz file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz
-rw-r--r-- 1 wljslmz wljslmz 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 wljslmz wljslmz   188 Sep 12 20:21 archive.tar.gz
$

您可以观察到两个存档文件的大小有很大不同,即使它们都包含相同的三个文件,这是由于使用了压缩 usingz标志。

3、创建压缩档案 (BZ2)

tar 支持其他几种压缩格式,其中之一是bz2或bzip2由扩展名tar.bz2或有时表示为tbz2,它可能会为您提供更小的存档大小,但反过来会消耗更多的 CPU,因此压缩/解压缩的过程可能比gz存档慢。

例子:

代码语言:javascript
复制
$ 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 wljslmz wljslmz 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 wljslmz wljslmz   212 Sep 12 20:25 archive.tar.bz2
-rw-r--r-- 1 wljslmz wljslmz   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
$

4、解压所有文件

使用该x选项可以简单地提取 tar 存档(无论是压缩的还是未压缩的),下面的例子将阐明它的用法:

代码语言:javascript
复制
$ tar xvf archive.tar
file1.txt
file2.txt
file3.txt
$ ls -l
total 24
-rw-r--r-- 1 wljslmz wljslmz 10240 Sep 19 18:25 archive.tar
-rw-r--r-- 1 wljslmz wljslmz    13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 wljslmz wljslmz    19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 wljslmz wljslmz    24 Sep 12 20:08 file3.txt
$

这适用于gz压缩存档:

代码语言:javascript
复制
$ tar xvf archive.tar.gz
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 wljslmz wljslmz 188 Sep 19 18:27 archive.tar.gz
-rw-r--r-- 1 wljslmz wljslmz  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 wljslmz wljslmz  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 wljslmz wljslmz  24 Sep 12 20:08 file3.txt
$

甚至对于bz2压缩存档来说:

代码语言:javascript
复制
$ tar xvf archive.tar.bz2
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 wljslmz wljslmz 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 wljslmz wljslmz  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 wljslmz wljslmz  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 wljslmz wljslmz  24 Sep 12 20:08 file3.txt
$

5、列出 tar 内容

要列出 tar 存档的内容,您可以使用t如下所示的标志:

代码语言:javascript
复制
$ tar tvf archive.tar.bz2
-rw-r--r-- wljslmz/wljslmz 13 2021-09-12 20:08 file1.txt
-rw-r--r-- wljslmz/wljslmz 19 2021-09-12 20:08 file2.txt
-rw-r--r-- wljslmz/wljslmz 24 2021-09-12 20:08 file3.txt
$

6、解压特定文件

只有一个文件可以从提取tar或tar.gz或tar.bz2通过指定文件名作为归档:

代码语言:javascript
复制
$ tar xvf archive.tar.bz2 file1.txt
file1.txt
$ ls -l
total 8
-rw-r--r-- 1 wljslmz wljslmz 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 wljslmz wljslmz  13 Sep 12 20:08 file1.txt
$

同样,您可以指定多个以空格分隔的文件名,以一次性提取它们。

代码语言:javascript
复制
$ tar xvf archive.tar.bz2 file1.txt file3.txt
file1.txt
file3.txt
$ ls -l
total 12
-rw-r--r-- 1 wljslmz wljslmz 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 wljslmz wljslmz  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 wljslmz wljslmz  24 Sep 12 20:08 file3.txt
$

7、使用通配符解压

要使用通配符提取一个或多个文件PATTERN,请使用--wildcards标志:

代码语言:javascript
复制
$ tar xvf archive.tar.bz2 --wildcards "file*"
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 wljslmz wljslmz 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 wljslmz wljslmz  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 wljslmz wljslmz  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 wljslmz wljslmz  24 Sep 12 20:08 file3.txt
$

8、将文件添加到存档

通过使用r或--append标记新文件名或通配符模式,可以将新文件添加/附加到现有的未压缩 tarball (请记住,这仅适用于未压缩.tar文件,不适用于tar.gz或tar.bz2压缩格式):

代码语言:javascript
复制
$ tar rvf archive.tar file-new*
file-new.txt
file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- wljslmz/wljslmz 13 2021-09-12 20:08 file1.txt
-rw-r--r-- wljslmz/wljslmz 19 2021-09-12 20:08 file2.txt
-rw-r--r-- wljslmz/wljslmz 24 2021-09-12 20:08 file3.txt
-rw-r--r-- wljslmz/wljslmz 15 2021-09-19 18:59 file2.txt
-rw-r--r-- wljslmz/wljslmz 10 2021-09-19 18:58 file4.txt
-rw-r--r-- wljslmz/wljslmz  9 2021-09-19 19:10 file-new.txt
-rw-r--r-- wljslmz/wljslmz  9 2021-09-19 19:10 file-new2.txt
$

您可以观察到archive.tar再次列出的内容显示了两个新添加的文件。

9、从存档中删除文件

可以使用--delete如下所示的标志从 tar 存档中删除特定文件(比较文件删除前和删除后的 tar 列表):

代码语言:javascript
复制
$ tar tvf archive.tar
-rw-r--r-- wljslmz/wljslmz 13 2021-09-12 20:08 file1.txt
-rw-r--r-- wljslmz/wljslmz 19 2021-09-12 20:08 file2.txt
-rw-r--r-- wljslmz/wljslmz 24 2021-09-12 20:08 file3.txt
-rw-r--r-- wljslmz/wljslmz 15 2021-09-19 18:59 file2.txt
-rw-r--r-- wljslmz/wljslmz 10 2021-09-19 18:58 file4.txt
-rw-r--r-- wljslmz/wljslmz  9 2021-09-19 19:10 file-new.txt
-rw-r--r-- wljslmz/wljslmz  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-- wljslmz/wljslmz 13 2021-09-12 20:08 file1.txt
-rw-r--r-- wljslmz/wljslmz 19 2021-09-12 20:08 file2.txt
-rw-r--r-- wljslmz/wljslmz 24 2021-09-12 20:08 file3.txt
-rw-r--r-- wljslmz/wljslmz 15 2021-09-19 18:59 file2.txt
-rw-r--r-- wljslmz/wljslmz 10 2021-09-19 18:58 file4.txt
$

同样,这仅适用于未压缩的 tarball,对于压缩存档格式将失败。

10、使用验证创建

创建未压缩的 tar 文件时,您可以使用以下W标志验证存档的内容:

代码语言:javascript
复制
$ tar cvfW archive.tar file*.txt
file1.txt
file2.txt
file3.txt
Verify file1.txt
Verify file2.txt
Verify file3.txt
$

这不能与压缩标志一起使用,尽管您可以tar稍后使用gzip或其他工具压缩创建的文件。

11、解压tar到文件夹

如果要将 tarball 内容解压缩到特定文件夹而不是当前目录,请使用-C带有目录路径的标志,如下所示:

代码语言:javascript
复制
$ 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 wljslmz wljslmz 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 wljslmz wljslmz 15 Sep 19 18:59 file2.txt
-rw-r--r-- 1 wljslmz wljslmz 24 Sep 12 20:08 file3.txt
-rw-r--r-- 1 wljslmz wljslmz 10 Sep 19 18:58 file4.txt
$

12、使用差异标志

您可以使用--diff或dflag 来查找 tar 存档中的文件与文件系统中的文件之间的任何更改,这是一个示例,该示例diff在 tar 内部和外部的文件相同时运行一次。更新文件后,它再次运行以显示输出的差异。

代码语言:javascript
复制
$ 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
$

13、排除文件

创建 tar 存档时可能需要排除特定文件,这可以通过--exclude标志来实现。

代码语言:javascript
复制
$ 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 wljslmz wljslmz 9 Sep 19 19:10 file-new.txt
-rw-r--r-- 1 wljslmz wljslmz 9 Sep 19 19:10 file-new2.txt
-rw-r--r-- 1 wljslmz wljslmz 5 Sep 19 19:20 file-new3.txt
-rw-r--r-- 1 wljslmz wljslmz 5 Sep 19 19:27 file1.txt
-rw-r--r-- 1 wljslmz wljslmz 6 Sep 19 19:27 file2.txt
-rw-r--r-- 1 wljslmz wljslmz 8 Sep 19 19:27 file3.txt
$ tar tvf archive.tar.gz
drwxr-xr-x wljslmz/wljslmz 0 2021-09-19 19:30 dir/
-rw-r--r-- wljslmz/wljslmz 5 2021-09-19 19:27 dir/file1.txt
-rw-r--r-- wljslmz/wljslmz 8 2021-09-19 19:27 dir/file3.txt
$

从上面的输出中可以看出,我们可以--exclude多次指定标志以在AND条件中指定多个文件名或模式。请注意,在上例中的六个文件中dir,只有两个文件满足要包含在archive.at.gz.

14、查看 tar 内容大小

我们可以使用以下命令获取压缩 tar 存档内容的大小:

代码语言:javascript
复制
$ tar tvf archive.tar.gz
-rw-r--r-- wljslmz/wljslmz 13 2021-09-12 20:08 file1.txt
-rw-r--r-- wljslmz/wljslmz 19 2021-09-12 20:08 file2.txt
-rw-r--r-- wljslmz/wljslmz 24 2021-09-12 20:08 file3.txt
$ tar -xzf archive.tar.gz --to-stdout|wc -c
56
$

bz2存档类似:

代码语言:javascript
复制
$ tar tvf archive.tar.bz2
-rw-r--r-- wljslmz/wljslmz 13 2021-09-12 20:08 file1.txt
-rw-r--r-- wljslmz/wljslmz 19 2021-09-12 20:08 file2.txt
-rw-r--r-- wljslmz/wljslmz 24 2021-09-12 20:08 file3.txt
$ tar -xjf archive.tar.bz2 --to-stdout|wc -c
56
$

15、保留权限

默认情况下,tar命令保留它正在归档的文件和目录的权限,尽管您可以明确指定相同的 using-p标志或--preserve-permissions如下所示:

代码语言:javascript
复制
$ tar cvpzf archive.tar.gz *.txt
file1.txt
file2.txt
file3.txt
$

总结

tar 长期以来一直是 Unix/Linux 系统上的有用实用程序,主要用于归档和备份任务,随着时间的推移,该实用程序已经发展出许多选项,它可以用于从简单到复杂的任务,前提是您知道它提供的功能。

本文介绍了您可以使用tar命令执行的一些基本操作,并展示了它如何帮助您完成日常系统管理任务。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络技术联盟站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、创建 tar 存档
  • 2、创建压缩档案 (GZ)
  • 3、创建压缩档案 (BZ2)
  • 4、解压所有文件
  • 5、列出 tar 内容
  • 6、解压特定文件
  • 7、使用通配符解压
  • 8、将文件添加到存档
  • 9、从存档中删除文件
  • 10、使用验证创建
  • 11、解压tar到文件夹
  • 12、使用差异标志
  • 13、排除文件
  • 14、查看 tar 内容大小
  • 15、保留权限
  • 总结
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档