zoukankan      html  css  js  c++  java
  • 学习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压缩

     

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

  • 相关阅读:
    Kafka文件存储机制那些事(转发)
    Kafka文件存储机制那些事(转发)
    消息队列设计精要(转发)
    RocketMQ原理解析-Broker(转发)
    Apache Kafka:下一代分布式消息系统(转发)
    新浪技术分享:我们如何扛下32亿条实时日志的分析处理(转发)
    消息队列技术介绍(转发)
    confluent kafka for .net
    kafka参考资料
    kafka架构(转发)
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/15237356.html
Copyright © 2011-2022 走看看