--strip-components -C 在 tar 中是什么意思?

19 tar directory path

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

tar xvzf FILE --exclude-from=exclude.me --strip-components 1 -C DESTINATION
Run Code Online (Sandbox Code Playgroud)

这是在这个答案中发布的。

来自man tar

--strip-components=NUMBER
提取时从文件名中去除 NUMBER 个主要成分

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

我不明白--strip-components.

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

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

Ark*_*zyk 25

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

--strip-components=number

在提取之前从文件名中去除给定数量的主要成分。

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

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

将此文件提取到文件“名称”。

和:

--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
Run Code Online (Sandbox Code Playgroud)

路径a/b/c是由3个部分组成:ab,和c

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

$ touch a/b/c/FILE
$ tar -cf archive.tar a/b/c/FILE
Run Code Online (Sandbox Code Playgroud)

FILEa/b/c/FILE路径的第四个元素。

列出 archive.tar 的内容:

$ tar tf archive.tar
a/b/c/FILE
Run Code Online (Sandbox Code Playgroud)

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

rm -r a
Run Code Online (Sandbox Code Playgroud)

使用--strip-components=1- only提取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
Run Code Online (Sandbox Code Playgroud)

有了--strip-components=2你看到的a/b-两个元素尚未重建:

$ 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
Run Code Online (Sandbox Code Playgroud)

随着--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
Run Code Online (Sandbox Code Playgroud)

-C选项告诉 tar 在运行请求的操作、提取和归档之前更改到给定目录。在此评论中, 您问:

要求 tar 做 cd:为什么要 cd?我的意思是问,为什么不只是 mv?

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

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

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

  • 当前目录 - 如果用户没有w权限,只是rx

  • 如果一个临时目录,无论它已经包含与tar存档和提取中名称相同的文件,都会覆盖它们怎么办?

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

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


lar*_*sks 16

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

如果您有一个文件名foo/bar/baz,那么与--strip-components 1提取的文件将被命名为bar/baz.


-C选项仅表示“更改目录”。如果您使用,-C /some/other/place您实际上tarcd /some/other/place在提取文件之前要求。这通常意味着文件将相对于/some/other/place.

  • `--strip-components` 对提取的*内容没有任何影响。它唯一能做的就是修改文件名。 (4认同)