乐趣区

关于linux:学习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 压缩

点击关注,第一工夫理解华为云陈腐技术~

退出移动版