--strip-components -C 在 tar 中意味着什么?

--strip-components -C 在 tar 中意味着什么?

我想确保我理解以下代码:

tar xvzf FILE --exclude-from=exclude.me --strip-components 1 -C DESTINATION

发布于这个答案

man tar

--strip-components=NUMBER
提取时从文件名中删除 NUMBER 个前导组件

-C,--directory=DIR
切换到目录DIR

没看懂说明书的解释--strip-components

关于-C,我理解它的意思是“将剥离的组件放入指定的目录中”。

这是什么--strip-components -C意思?

答案1

您在问题中包含的联机帮助页片段来自 GNU tar 的 man。 GNU 是一个更喜欢的软件项目信息手册胜过联机帮助页。事实上,tar 联机帮助页2014 年才被添加到 GNU tar 源代码树中 它仍然只是一个参考,而不是一个带有示例的完整手册。您可以使用 调用完整的信息手册info tar,也可以在线获取 这里。它包含几个--strip-components用法示例,相关片段是:

--strip-components=number

提取之前从文件名中去除给定数量的前导组件。

例如,如果存档“archive.tar”包含“some/file/name”,则运行

tar --extract --file archive.tar --strip-components=2

会将此文件提取到文件“name”。

和:

--strip-components=number

提取之前从文件名中去除给定数量的前导组件。

例如,假设您已将整个“/usr”层次结构归档到名为“usr.tar”的 tar 归档文件中。在其他文件中,该存档包含“usr/include/stdlib.h”,您希望将其提取到当前工作目录。为此,您输入:

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

选项“--strip=2”指示 tar 去除文件名中的两个主要部分(“usr/”和“include/”)。


也就是说;

还有 tar 的其他实现,例如FreeBSD tar 联机帮助页该命令有不同的解释:

--strip-components count

删除指定数量的前导路径元素。包含较少元素的路径名将被静默跳过。请注意,路径名是在检查包含/排除模式之后、安全检查之前编辑的。

换句话说,您应该将 Unix 路径理解为一系列由 分隔的元素/(除非只有一个/)。

这是我自己的例子(其他示例可在我上面链接的信息手册中找到):

让我们创建一个新的目录结构:

mkdir -p a/b/c

路径a/b/c由 3 个元素组成:ab、 和c

在此目录中创建一个空文件并将其放入 .tar 存档中:

$ touch a/b/c/FILE
$ tar -cf archive.tar a/b/c/FILE

FILE是路径的第四个元素a/b/c/FILE

列出 archive.tar 的内容:

$ tar tf archive.tar
a/b/c/FILE

现在,您可以使用一个参数来提取 archive.tar --strip-components,该参数将告诉它在提取时要从其中删除多少个路径元素a/b/c/FILE。删除原来的a目录:

rm -r a

--strip-components=1仅提取a尚未重新创建的内容:

$ tar xf archive.tar --strip-components=1
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 3 ja users  4096 Mar 26 15:43 b
$ tree b
b
└── c
    └── FILE

1 directory, 1 file

您会--strip-components=2看到a/b- 2 个元素尚未重新创建:

$ rm -r b
$ tar xf archive.tar --strip-components=2
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 2 ja users  4096 Mar 26 15:46 c
$ tree c
c
└── FILE

0 directories, 1 file

--strip-components=33 个元素a/b/c尚未重新创建,我们进入了FILE运行的同一级别目录tar

$ rm -r c
$ tar xf archive.tar --strip-components=3
$ ls -Al
total 12
-rw-r--r-- 1 ja users     0 Mar 26 15:39 FILE
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar

-C选项告诉 tar 在运行请求的操作之前更改到给定目录,提取但也归档。在这条评论 你问:

要求 tar 进行 cd:为什么是 cd?我想问一下,为什么不只是mv?

为什么你认为这样mv更好?您希望首先将 tar 存档解压到哪个目录:

  • /tmp - 如果丢失或已满怎么办?

  • “$TMPDIR” - 如果未设置、丢失或已满怎么办?

  • 当前目录 - 如果用户没有w权限,只有r和 该怎么办x

  • 如果临时目录(无论它是什么)已经包含与存档中同名的文件tar并提取将覆盖它们怎么办?

  • 如果临时目录(无论它是什么)不支持 Unix 文件系统,并且有关所有权、可执行位等的所有信息都会丢失怎么办?

另请注意,这也是其他程序中的-C常见选项,change directorygit制作我首先想到的是。

答案2

--strip-components选项用于修改提取的文件的文件名。 --strip-components <N>表示“删除文件名的第一个<N>组件”,其中“组件”指的是由 . 分隔的路径部分/

如果您有文件名foo/bar/baz,则将以--strip-components 1提取的文件命名bar/baz


-C选项仅意味着“更改目录”。如果您使用,-C /some/other/place则实际上是在提取文件之前tar询问。cd /some/other/place这通常意味着文件将相对于/some/other/place.

答案3

为了补充好的答案拉斯克斯,尝试帮助消除围绕该-C选项的混乱:

手册tar页指出了该-C选项:

-C, --directory=DIR
              Change  to DIR before performing any operations.  This option is
              order-sensitive, i.e. it affects all options that follow.

所以,它不像mv- 它实际上是告诉tar更改到不同的工作目录。另请注意顺序很重要。所以:

tar r -f archive.tar -C /path file1 file2

会将文件file1和附加到 的file2位置,同时/patharchive.tar

tar r -f archive.tar file1 file2 -C /path file3 file4

将从当前工作目录附加file1and ,然后从该位置附加and 。file2file3file4/path

--strip-components-C是独立且不相关的选项tar。第一个影响存档文件解压后的文件夹结构,并指定用于指定存档外部文件的-C工作目录。tar

答案4

我不确定我能通过其他答案未涵盖的解释来说什么。相反,我会尝试通过示例来帮助您。

Arkadiusz Drabczyk 给出了例子GNU tar 手册 其中您的存档包含一个大目录树(例如,全部 /usr):

$ tar -cf usr.tar  /usr

并且您想要深入查看存档并从低级子目录中提取文件:

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

手册没有说明的是,如果你说

$ tar -xf usr.tar           usr/include/stdlib.h

然后tarusr在当前目录下创建一个目录,并 include在 中创建一个子目录usr,然后解压stdlib.h./usr/include.如果这就是你想要的结果,那就好;使用该命令。但是,如果您想stdlib.h在当前目录中,则需要

$ mv usr/include/stdlib.h .

然后可能rmdir -p usr/include。这是可行的,但很乏味。  --strip=2节省您大量的打字时间。


-Cc也可以与(小写 C)选项(创建存档)一起使用 ,这可能更容易理解。假设约翰、凯特、拉里和玛丽正在合作写一本书;他们正在分别撰写第一章、第二章、第三章和第四章。约翰和凯特(仅)使用同一台计算机,他们希望将迄今为止所做的工作存档并发送给其他作者。您可以执行以下任一操作:

  光盘到一些合适的目录)
$ tar cf chap12.tar /home/john/chap1 /home/kate/chap2
或者

$ cd /home
$ tar cf /tmp/chap12.tar john/chap1 kate/chap2

但这些创建了一个编码的john/档案kate/。  如果你这样做,这将成为拉里和玛丽使用--strip=2或 --strip=1提取档案  如果您想保存那些打扰的人(和/或将您的名字保留在档案之外;例如,出于隐私原因),那么您可以

  光盘到一些合适的目录)
$ tar cf chap12.tar -C /home/john chap1 -C /home/kate chap2

然后存档将仅显示chap1chap2目录。

相关内容