摘要:在本文中,您将学习与tar 命令一起使用的最常用标志、如何创建和提取 tar 存档以及如何创建和提取 gzip 压缩的 tar 存档。

本文分享自华为云社区《Linux 中的 Tar 命令:压缩和提取文件,学会了吗》,作者:Tiamo_T 。

Linux tar 命令如何工作?

tar 命令用于创建 .tar、.tar.gz、.tgz 或 tar.bz2 档案,通常称为“tarball”。扩展名 .tar.gz 和 .tgz 用于识别使用 gzip 压缩生成的档案,以减少档案的大小。 扩展名为 .tar.bz2 的档案是使用 bzip2 压缩生成的。

Linux 发行版提供 tar 二进制文件,无需外部命令的帮助即可支持 gzip 压缩。正如我们将在本文中看到的那样,这可能不适用于其他类型的压缩。

让我们从tar命令的三个示例开始,以熟悉最常见的标志。

创建一个包含两个文件的存档

这是 tar 命令的基本示例,在这种情况下我们不使用压缩:

tar -cf archive.tar testfile1 testfile2

此命令创建一个名为 archive.tar 的存档文件,其中包含两个文件:testfile1 和 testfile2。

这是两个标志的含义:

  • -c(与-create 相同):创建一个新存档
  • -f:它允许指定一个存档文件(在这种情况下称为archive.tar)

file 命令确认 archive.tar 是一个存档:

[myuser@localhost]$ file archive.tar
archive.tar: POSIX tar archive (GNU)

另一个有用的标志是-v标志,它提供在 Linux 上执行tar命令期间处理的文件的详细输出。

如果我们在创建存档时也传递 -v 标志,让我们看看输出如何变化:

[myuser@localhost]$ tar -cfv archive.tar testfile1 testfile2
tar: archive.tar: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

奇怪,由于某种原因,我们得到了一个错误……

这是因为 tar 命令根据 -f 标志后面的内容创建了一个具有名称的存档,在这种情况下,在 -f 标志之后是v。

结果是一个名为 v 的存档,您可以从下面的 ls 输出中看到:

[myuser@localhost]$ ls -al
total 20
drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 09:42 .
drwxrwxrwt. 6 root root 4096 Jul 17 09:38 ..
-rw-rw-r--. 1 myuser mygroup 0 Jul 17 09:38 testfile1
-rw-rw-r--. 1 myuser mygroup 0 Jul 17 09:38 testfile2
-rw-rw-r--. 1 myuser mygroup 10240 Jul 17 09:42 v [myuser@localhost]$ file v
v: POSIX tar archive (GNU)

“没有这样的文件或目录”目录是由于 tar 试图创建一个名为 v 的存档,其中包含三个文件:archive.tar、testfile1 和 testfile2。

但是 archive.tar 不存在,因此出现错误。

这表明 tar 的标志顺序是多么重要。

让我们交换 tar 命令中的 -f 和 -v 标志并重试:

[myuser@localhost]$ tar -cvf archive.tar testfile1 testfile2
testfile1
testfile2

这次一切顺利,详细标志显示了添加到我们正在创建的存档中的两个文件的名称。

说得通?

详细列出 tar 存档中的所有文件

要列出 tar 存档中的所有文件而不提取其内容,我们将引入第四个标志:

-t : 列出档案的内容

我们现在可以将三个标志放在一起:-t、-v和-f来查看我们之前创建的存档中的文件:

[myuser@localhost]$ tar -tvf archive.tar
-rw-rw-r-- myuser/mygroup 0 2020-07-17 09:38 testfile1
-rw-rw-r-- myuser/mygroup 0 2020-07-17 09:38 testfile2

我应该将 Dash 与 Tar 一起使用吗?

我注意到在某些情况下出现标志之前的破折号,但情况并非总是如此。

所以,让我们看看是否通过破折号有什么不同。

首先,让我们尝试在不使用标志前的破折号的情况下运行相同的命令:

[myuser@localhost]$ tar tvf archive.tar
-rw-rw-r-- myuser/mygroup 0 2020-07-17 09:38 testfile1
-rw-rw-r-- myuser/mygroup 0 2020-07-17 09:38 testfile2

输出是相同的,这意味着不需要破折号。

只是给您一个想法,您可以按以下方式运行 tar 命令并获得相同的输出:

tar -t -v -f archive.tar
tar -tvf archive.tar
tar -tvf archive.tar
tar --list --verbose --file archive.tar

最后一个命令使用长选项样式作为提供给 Linux 命令的标志。

您可以看到使用标志的简短版本要容易得多。

从存档中提取所有文件

让我们引入一个额外的标志,允许提取 tar 存档的内容。这是-x标志。

要提取我们之前创建的文件的内容,我们可以使用以下命令:

tar -xvf archive.tar
(the two lines below are the output of the command in the shell)
testfile1
testfile2
ls -al
total 20
drwxrwxr-x 2 myuser mygroup 59 Feb 10 21:21 .
drwxr-xr-x 3 myuser mygroup 55 Feb 10 21:21 ..
-rw-rw-r-- 1 myuser mygroup 10240 Feb 10 21:17 archive.tar
-rw-rw-r-- 1 myuser mygroup 54 Feb 10 21:17 testfile1
-rw-rw-r-- 1 myuser mygroup 78 Feb 10 21:17 testfile2

正如您所看到的,我们使用-x标志来提取档案的内容,使用-v标志来详细提取,使用-f标志来引用在标志之后指定的档案文件 (archive.tar)。

注意:如前所述,我们只在所有标志之前输入一次破折号字符。我们可以在每个标志之前指定破折号,而输出将是相同的。

tar -x -v -f archive.tar

还有一种方法可以从存档中提取单个文件。

在这种情况下,考虑到我们的存档中只有两个文件,这并没有太大区别。但是,如果您有一个包含数千个文件的存档并且您只需要其中一个,那么它会产生巨大的差异。

如果您有一个备份脚本来创建过去 30 天的日志文件存档,并且您只想查看特定日期的日志文件的内容,那么这很常见。

要仅从 archive.tar 中提取 testfile1,您可以使用以下通用语法:

tar -xvf {archive_file} {path_to_file_to_extract}

在我们的具体案例中:

tar -xvf archive.tar testfile1

让我们看看如果我创建一个包含两个目录的 tar 存档会发生什么变化:

[myuser@localhost]$ ls -ltr
total 8
drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:34 dir1
drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:34 dir2 [myuser@localhost]$ tar -cvf archive.tar dir*
dir1/
dir1/testfile1
dir2/
dir2/testfile2

注意:请注意,我使用通配符 * 将名称以“dir”开头的任何文件或目录包含在存档中。

如果我只想提取 testfile1 命令将是:

tar -xvf archive.tar dir1/testfile1

解压后保留了原来的目录结构,所以我将在dir1中得到testfile1:

[myuser@localhost]$ ls -al dir1/
total 8
drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:36 .
drwxrwxr-x. 3 myuser mygroup 4096 Jul 17 10:36 ..
-rw-rw-r--. 1 myuser mygroup 0 Jul 17 10:34 testfile1

一切都清楚了吗?

减少 tar 档案的大小

Gzip和Bzip2压缩可用于减小 tar 存档的大小。

启用压缩的其他 tar 标志是:

  • -z用于 Gzip 压缩:长标志是–gzip
  • -j用于 Bzip2 压缩:长标志为–bzip2

要使用详细输出创建名为 archive.tar.gz 的 gzipped tar 存档,我们将使用以下命令(也是创建 tar 存档时最常用的命令之一):

tar -czvf archive.tar.gz testfile1 testfile2

并提取其内容,我们将使用:

tar -xzvf archive.tar.gz

我们也可以使用 .tgz 扩展名而不是 .tar.gz,结果是一样的。

现在,让我们创建一个使用 bzip2 压缩的存档:

[myuser@localhost]$ tar -cvjf archive.tar.bz2 testfile*
testfile1
testfile2
/bin/sh: bzip2: command not found
tar: Child returned status 127
tar: Error is not recoverable: exiting now

错误“bzip2: command not found”表明 tar 命令正在尝试使用 bzip2 命令进行压缩,但在我们的 Linux 系统上找不到该命令。

解决办法是安装bzip2。该过程取决于您使用的 Linux 发行版,在我的情况下是使用 yum 作为包管理器的 CentOS。

让我们使用以下yum 命令安装 bzip2 :

yum install bzip2

我可以使用 which 命令确认 bzip2 二进制文件存在:

[myuser@localhost]$ which bzip2
/usr/bin/bzip2

现在,如果我再次使用 bzip2 压缩运行 tar 命令:

[myuser@localhost]$ tar -cvjf archive.tar.bz2 testfile*
testfile1
testfile2
[myuser@localhost]$ ls -al
total 16
drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:45 .
drwxrwxrwt. 6 root root 4096 Jul 17 10:53 ..
-rw-rw-r--. 1 myuser mygroup 136 Jul 17 10:54 archive.tar.bz2
-rw-rw-r--. 1 myuser mygroup 128 Jul 17 10:45 archive.tar.gz
-rw-rw-r--. 1 myuser mygroup 0 Jul 17 10:44 testfile1
-rw-rw-r--. 1 myuser mygroup 0 Jul 17 10:44 testfile2

一切正常!

另外,考虑到我很好奇,我想根据 Linux file 命令查看两个存档(.tar.gz 和 .tar.bz2)之间的区别:

[myuser@localhost]$ file archive.tar.gz
archive.tar.gz: gzip compressed data, last modified: Fri Jul 17 10:45:04 2020, from Unix, original size 10240
[myuser@localhost]$ file archive.tar.bz2
archive.tar.bz2: bzip2 compressed data, block size = 900k

如您所见,Linux 可以区分使用两种不同压缩算法生成的档案。

结论

在本文中,您学习了与tar 命令一起使用的最常用标志、如何创建和提取 tar 存档以及如何创建和提取 gzip 压缩的 tar 存档。

让我们再次回顾一下所有的标志:

  • -c:创建一个新的存档
  • -f:允许指定存档的文件名
  • -t:列出档案的内容
  • -v:详细列出已处理的文件
  • -x:从存档中提取文件
  • -z:使用gzip压缩
  • -j:使用bzip2压缩

点击关注,第一时间了解华为云新鲜技术~

学习Linux tar 命令:最简单也最困难的更多相关文章

  1. Linux tar命令高级用法——备份数据

    Linux tar命令高级用法——备份数据 2015-12-31 Linux学习 Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件 ...

  2. linux tar命令 压缩、打包、解压 详解

    linux tar命令 压缩.打包.解压 详解 1.常用压缩命令 tar –czvf 压缩后的文件.tar.gz 要压缩的文件 2.常用解压命令 tar –xzvf 解压后的文件.tar.gz [要解 ...

  3. Linux tar命令之--exclude参数 排除指定的文件或目录

    https://my.oschina.net/u/3285916/blog/1632552 参数: --exclude 打包时排除不需要处理的文件或目录 说明: tar -zcf a.tar.gz 打 ...

  4. Linux tar 命令用法

    tar 命令可以为linux的文件和目录创建档案.利用 tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar 最初被用来在磁带上创建档案,现在,用户 ...

  5. [转]Linux tar 命令

    一.使用介绍 1.名词区分 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文 ...

  6. linux tar命令简介

    一.使用介绍 1.名词区分 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文 ...

  7. linux tar命令

    tar命令打包还是压缩需要看所调用的命令参数....tar在使用时可以调用命令参数, 比如tar -xvf +文件名就是解包,但是不是解压...只有在使用了参数z等调用gzip等 压缩命令时才是压缩或 ...

  8. linux Tar 命令参数详解

    tar命令 . 作用 tar命令是Unix/Linux系统中备份文件的可靠方法,几乎可以工作于任何环境中,它的使用权限是所有用户. . 格式 tar [主选项+辅选项] 文件或目录 eg: tar z ...

  9. linux tar 命令

    tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件! ...

随机推荐

  1. Linux开机以root账户自动登录

    最近我们的自动化测试平台需要支持中标麒麟系统,对于我们来说要让这个系统支持分布式自动化测试,最重要的一点就是虚拟机启动后自动以root账户登录系统,并且执行我们的环境配置脚本,那么如何能让它开启自动登 ...

  2. Maven的属性,${project.basedir},${project.build.directory}:项目构件输出目录,默认为 target/

    内置属性 主要有两个常用内置属性:${basedir}项目的根目录(包含pom.xml文件的目录),${version}项目版本 POM属性 用户可以使用该属性引用POM文件中对应元素的值,常用的PO ...

  3. Apache Flink jobmanager/logs路径遍历CVE-2020-17519

    影响版本 1.11.0 1.11.1 1.11.2 poc http://192.168.49.2:8081/jobmanager/logs/..%252f..%252f..%252f..%252f. ...

  4. cent os 基本命令一

    命令详情 # man [命令] *********************目录****************************** 一.文件及目录操作 二,vi 三,vim 四,用户操作 五, ...

  5. 论文笔记:(2021CVPR)PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds

    目录 摘要 1.引言 2.相关工作 将点云映射到常规二维或三维栅格(体素) 基于MLPs的点表示学习 基于点卷积的点表示学习 动态卷积和条件卷积 3.方法 3.1 回顾 3.2 动态内核组装 Weig ...

  6. anyRTC Web SDK 实现音视频呼叫功能

    前言 大家好,今天小编带给大家一个基于 anyRTC Web SDK 实现音视频呼叫的功能(本项目采用vue开发). 前提条件 在开始写代码之前还需要做一些准备工作,如果你之前没有使用过 anyRTC ...

  7. VS2019 +MySQL+EntityFramework 使用配置与坑点避免随记

    一.安装运行环境 首先我们到mysql的官方网站上下载 mysql-installer-community-8.0.26.0 ,或者其他特定版本,通过它我们可以先将 mysql-for-visuals ...

  8. 分布式ID(CosId)之号段链模式性能(1.2亿/s)解析

    分布式ID(CosId)之号段链模式性能(1.2亿/s)解析 上一篇文章<分布式ID生成器(CosId)设计与实现>我们已经简单讨论过CosId的设计与实现全貌. 但是有很多同学有一些疑问 ...

  9. C++ 2(将类分文件) //点和圆的关系 //设计一个圆形类 和一个点类 计算点和圆的关系 //点到圆心的距离 == 半径 点在圆上 //点到圆心的距离 > 半径 点在圆外 //点到圆心的距离 < 半径 点在圆内 //点到圆心的距离 获取 ....... (x1 -x2)^2 + (y1-y2)^2 开根号 和半径对比 // 计算 可以 两边同时 平方

    1 源文件 main.cpp 2 //点和圆的关系 3 //设计一个圆形类 和一个点类 计算点和圆的关系 4 //点到圆心的距离 == 半径 点在圆上 5 //点到圆心的距离 > 半径 点在圆外 ...

  10. Logback 快速入门 / 使用详解

    官方文档: http://logback.qos.ch/manual/index.html 一.简介 Java 开源日志框架,以继承改善 log4j 为目的而生,是 log4j 创始人 Ceki Gü ...