

学习Linux tar 命令:最简单也最困难
source link: https://my.oschina.net/u/4526289/blog/5233847
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

摘要:在本文中,您将学习与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压缩
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK