我想确保我理解以下代码:
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个部分组成:a
,b
,和c
。
在此目录中创建一个空文件并将其放入 .tar 存档:
$ touch a/b/c/FILE
$ tar -cf archive.tar a/b/c/FILE
Run Code Online (Sandbox Code Playgroud)
FILE
是a/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=3
3个元素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
权限,只是r
和
x
?
如果一个临时目录,无论它已经包含与tar
存档和提取中名称相同的文件,都会覆盖它们怎么办?
如果一个临时目录,不管它是什么,不支持 Unix 文件系统,所有关于所有权、可执行位等的信息都会丢失怎么办?
另请注意,这-C
也是change directory
其他程序中的常见选项,我首先想到的是Git和
make。
lar*_*sks 16
该--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
.