学习Linux tar 命令:最简单也最困难
摘要:在本文中,您将学习与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 命令:最简单也最困难的更多相关文章
- Linux tar命令高级用法——备份数据
Linux tar命令高级用法——备份数据 2015-12-31 Linux学习 Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件 ...
- linux tar命令 压缩、打包、解压 详解
linux tar命令 压缩.打包.解压 详解 1.常用压缩命令 tar –czvf 压缩后的文件.tar.gz 要压缩的文件 2.常用解压命令 tar –xzvf 解压后的文件.tar.gz [要解 ...
- Linux tar命令之--exclude参数 排除指定的文件或目录
https://my.oschina.net/u/3285916/blog/1632552 参数: --exclude 打包时排除不需要处理的文件或目录 说明: tar -zcf a.tar.gz 打 ...
- Linux tar 命令用法
tar 命令可以为linux的文件和目录创建档案.利用 tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar 最初被用来在磁带上创建档案,现在,用户 ...
- [转]Linux tar 命令
一.使用介绍 1.名词区分 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文 ...
- linux tar命令简介
一.使用介绍 1.名词区分 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文 ...
- linux tar命令
tar命令打包还是压缩需要看所调用的命令参数....tar在使用时可以调用命令参数, 比如tar -xvf +文件名就是解包,但是不是解压...只有在使用了参数z等调用gzip等 压缩命令时才是压缩或 ...
- linux Tar 命令参数详解
tar命令 . 作用 tar命令是Unix/Linux系统中备份文件的可靠方法,几乎可以工作于任何环境中,它的使用权限是所有用户. . 格式 tar [主选项+辅选项] 文件或目录 eg: tar z ...
- linux tar 命令
tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件! ...
随机推荐
- vue 使用 lang="scss" 报错
npm install sass-loader@7.3.1 --save-dev npm install node-sass --save npm install style-loader --sav ...
- canvas点阵函数波动,类似飘带或水波
canvas动画利用函数波动特点制作水波动画 <canvas id="myCanvas" width="500" height="400&quo ...
- 硬核万字长文,深入理解 Java 字节码指令(建议收藏)
Java 字节码指令是 JVM 体系中非常难啃的一块硬骨头,我估计有些读者会有这样的疑惑,"Java 字节码难学吗?我能不能学会啊?" 讲良心话,不是我谦虚,一开始学 Java 字 ...
- Docker 安装与卸载
Docker卸载与安装 卸载旧的版本 卸载 yum -y remove docker-ce docker-cli-io containerd.io rm -rf var /var/lib/docker ...
- DC-4 靶机渗透测试
DC-4 渗透测试 冲冲冲,努力学习 .掌握 hydra ,nc反弹shell 记住你要干嘛, 找地方上传shell(大多以后台登录为切入点,再反弹shell),shell提权到root 操作机:ka ...
- 阿里、腾讯、百度、网易、美团Android面试经验分享,拿到了百度、腾讯offer
基本情况 2021届普通本科,Android开发岗. 此文主要是2020年秋招面试经验汇总,最终拿到了百度.腾讯的offer. 主要包括阿里三面,腾讯四面,百度三面,网易三面,美团一场面完. 阿里(由 ...
- Linux 鸟叔的私房菜--完全结束
2018年10月22日 我不想再拖下去了,一本书看不完就无法进行下一本书的阅读,可能算是我的一个强迫症(借口吧) 之前看05年第一版<鸟叔的Linux私房菜>停在脚本语言那里,迟迟没有前进 ...
- 题解 v
传送门 考场上只会爆搜--觉得重复状态其实有很多但不知道怎么记忆化,结果-- 对于类似这样n不算太小但只有二三十,而重复状态极多的题其实也是可以跑状压/记搜的,状态可以开map存 然后就是爆搜,就没什 ...
- Tomcat配置SSL证书(PFX证书)
公司项目,应该是阿里云服务器 在windows2008 R2搭建的 Tomcat部署SSL证书,本文以PFX证书为例. 配置好之后开始 一.什么是SSL(证书)? SSL证书服务(Alibaba Cl ...
- .NET Core程序发布报错:project.assets.json”没有“.NETCoreApp,Version=v3.1/win-x64”的目标。确保已运行还原,且“netcoreapp3.1”已包含在项目的 TargetFrameworks中。
在控制台中使用命令发布.NET Core程序的时候,报如下的错误: project.assets.json"没有".NETCoreApp,Version=v3.1/win-x64& ...