Contents

Linux TAR命令在不保留目录结构的情况下归档文件

1. 概述

Linux tar命令  用于将多个文件保存到存档文件中。我们稍后可以提取所有文件或仅提取存档文件中所需的文件。tar代表“磁带存档”。

** tar,默认情况下,保留归档文件的目录结构。但是,在某些情况下,我们可能希望在不保留目录结构的情况下归档文件。**在本教程中,我们将讨论如何实现这一目标。

2. tar默认行为

让我们证明tar保留归档文件的目录结构。我们的目录结构如下:

$ tree
.
|___ directory1
|    |__ directory1.1
|    |    |_ file1.1.1
|    |    |_ file1.1.2
|    |__ directory1.2
|         |_ file1.2.1
|         |_ file1.2.2
|___ directory2
|    |__ directory2.1
|         |_ file2.1.1
5 directories, 5 files

让我们使用tar归档directory1/directory1.1目录:

$ tar -cf archive.tar directory1/directory1.1

现在,让我们列出存档文件的内容:

$ tar -tf archive.tar
directory1/directory1.1
directory1/directory1.1/file1.1.1
directory1/directory1.1/file1.1.2

如我们所见,创建的存档文件保持目录结构。这意味着当我们提取归档文件的内容时,我们将拥有相同的目录结构。

3. 使用场景

我们将通过示例讨论几种方法。

3.1. 对单个目录使用 -C 选项

一种方法是使用tar命令的*-C选项。我们可以设想使用-C选项对tar*命令的操作分为两个步骤:

  • 将当前目录更改为*-C*选项给定的目录。
  • 在新的当前目录中归档指定的文件。

让我们归档directory1/directory1.1

$ tar -cf archive.tar -C directory1/directory1.1 .

** tar命令末尾的点 (.)很重要。这意味着我们要归档新的当前目录(即directory1/directory1.1)。**

现在,让我们检查存档文件的内容,即archive.tar

$ tar -vf archive.tar
./
./file1.1.1
./file1.1.2

从命令的输出中我们可以看到,目录结构没有保存在存档文件中。

我们也可以使用*–directory选项而不是-C*选项。它们完全相同。

3.2. 在目标目录中使用tar命令

正如tar的操作所暗示的,我们只需将当前目录更改为目标目录,并将目录中的所有文件归档即可:

$ cd directory1/directory1.1
$ tar -cf archive.tar .
$ tar -vf archive.tar
./
./file1.1.1
./file1.1.2

我们的结果与上一节中的结果相同。

3.3. 对多个目录使用*-C*选项

如果我们想归档两个或多个不同的目录而不保留目录结构怎么办?我们仍然可以使用*-C选项。让我们继续举个例子。假设我们要归档目录directory1/directory1.1directory2/directory2.1*:

$ tar -cf archive.tar -C directory1/directory1.1 . -C ../../directory2/directory2.1 .

本例中的tar命令首先将当前目录更改为directory1/directory1.1。我们用“ -C directory1/directory1.1 来指定它。“。然后它将文件存档在该目录中。我们必须指定相对于第一个目录的第二个目录。所以我们用“ -C ../../directory2/directory2.1 来指定它。” tar命令再次更改目录。最后,它将该目录中的文件添加到存档文件中。简而言之,**tar命令按给定顺序处理目录。

让我们检查创建的存档文件的内容:

$ tar -tf archive.tar
./
./file1.1.1
./file1.1.2
./
./file2.1.1

输出中的多个当前目录 ( ./ ) 来自tar在两个不同目录中的操作。当我们提取存档文件时,它没有任何不利影响。

3.4. 更新多个目录的存档文件

当我们有多个目录要归档时,我们可以迭代地形成归档文件。我们可以使用第一个目录创建存档文件,然后将其他目录逐个添加到存档文件中:

tar_file=archive.tar
dir_list="directory1/directory1.1 directory1/directory1.2 directory2/directory2.1"
tar_flag="-cf"
for dir in $dir_list
do
   tar $tar_flag $tar_file -C $dir .
   tar_flag="-rf"
done

在上面的 bash 脚本片段中,tar_file是要创建的存档文件的名称。dir_list包含我们要归档的目录的名称。 当我们第一次进入 for 循环时,我们使用*-cf选项创建存档文件,并将directory1/directory1.1中的文件添加到其中。然后,在 for 循环的连续迭代中,我们使用–rf选项将剩余目录(directory1/directory1.2directory2/directory2.1)*中的文件附加到归档文件中。

让我们检查存档文件的内容:

$ tar -tf archive.tar
./
./file1.1.1
./file1.1.2
./
./file1.2.2
./file1.2.1
./
./file2.1.1

从输出中可以明显看出,存档文件不包括目录。

3.5. 使用*–strip-components*选项

假设我们有一个存档文件,但它保留了目录结构:

$ tar -tf archive.tar
directory1/
directory1/directory1.2/
directory1/directory1.2/file1.2.2
directory1/directory1.2/file1.2.1
directory1/directory1.1/
directory1/directory1.1/file1.1.1
directory1/directory1.1/file1.1.2

我们可以在没有目录结构的情况下提取这个归档文件的内容。为此,我们必须使用tar的* –strip-components*选项:

$ ls
archive.tar
$ mkdir tmp && cd tmp
$ tar --strip-components=2 -xf ../archive.tar
$ ls
file1.1.1  file1.1.2  file1.2.1  file1.2.2

–strip-components选项需要一个数字。当我们提取归档文件时, tar从文件名中去除给定数量的目录。由于我们在示例中给出了“ –strip-components=2 ” ,因此tar从文件路径中删除directory1/directory1.1directory1/directory1.2 。因此,它将文件提取到当前目录,而没有目录结构。

–strip-components选项的语法可能在不同 Linux 发行版中的tar实现之间略有不同,但基本思想是相同的。