摘要:在本文中,您将学习与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 testfile2tar: archive.tar: Cannot stat: No such file or directorytar: Exiting with failure status due to previous errors
奇怪,因为某种原因,咱们失去了一个谬误……
这是因为 tar 命令依据 -f 标记前面的内容创立了一个具备名称的存档,在这种状况下,在 -f 标记之后是v。
后果是一个名为 v 的存档,您能够从上面的 ls 输入中看到:
[myuser@localhost]$ ls -altotal 20drwxrwxr-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 vv: POSIX tar archive (GNU)
“没有这样的文件或目录”目录是因为 tar 试图创立一个名为 v 的存档,其中蕴含三个文件:archive.tar、testfile1 和 testfile2。
然而 archive.tar 不存在,因而呈现谬误。
这表明 tar 的标记程序是如许重要。
让咱们替换 tar 命令中的 -f 和 -v 标记并重试:
[myuser@localhost]$ tar -cvf archive.tar testfile1 testfile2testfile1testfile2
这次一切顺利,具体标记显示了增加到咱们正在创立的存档中的两个文件的名称。
说得通?
具体列出 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.tartar -tvf archive.tartar --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)testfile1testfile2ls -altotal 20drwxrwxr-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 -ltrtotal 8drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:34 dir1drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:34 dir2[myuser@localhost]$ tar -cvf archive.tar dir*dir1/dir1/testfile1dir2/dir2/testfile2
留神:请留神,我应用通配符 * 将名称以“dir”结尾的任何文件或目录蕴含在存档中。
如果我只想提取 testfile1 命令将是:
tar -xvf archive.tar dir1/testfile1
解压后保留了原来的目录构造,所以我将在dir1中失去testfile1:
[myuser@localhost]$ ls -al dir1/total 8drwxrwxr-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*testfile1testfile2/bin/sh: bzip2: command not foundtar: Child returned status 127tar: 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*testfile1testfile2[myuser@localhost]$ ls -altotal 16drwxrwxr-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压缩
点击关注,第一工夫理解华为云陈腐技术~