我想确保我理解以下代码:
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
意思?
您在问题中包含的手册页片段来自 man for GNU tar。GNU 是一个软件项目,它更喜欢信息手册而不是手册页。事实上,tar 手册页仅在 2014 年才被添加到 GNU tar 源代码树中 ,它仍然只是一个参考,而不是带有示例的完整手册。您可以使用 调用完整的信息手册
info tar
,也可以 在此处在线获取。它包含几个--strip-components
使用示例,相关片段是:和:
那就是说;
还有其他的 tar 实现,例如FreeBSD tar 手册页对此命令有不同的解释:
换句话说,您应该将 Unix 路径理解为由
/
(除非只有一个/
)分隔的元素序列。这是我自己的示例(我在上面链接到的信息手册中提供了其他示例):
让我们创建一个新的目录结构:
路径
a/b/c
由 3 个元素组成:a
、b
和c
。在此目录中创建一个空文件并将其放入 .tar 存档:
FILE
是a/b/c/FILE
路径的第四个元素。列出archive.tar 的内容:
您现在可以提取 archive.tar和一个参数,该参数将告诉它在提取时
--strip-components
要删除多少个路径元素。a/b/c/FILE
删除原始a
目录:提取
--strip-components=1
- onlya
尚未重新创建:您
--strip-components=2
会看到a/b
- 2 个元素尚未重新创建:没有重新创建
--strip-components=3
3 个元素,我们进入了我们运行的同一级别目录:a/b/c
FILE
tar
-C
选项告诉 tar 在运行请求的操作之前更改到给定目录,提取但也存档。在此评论中 ,您问:为什么你认为这样
mv
更好?您想先将 tar 存档解压缩到哪个目录:/tmp - 如果它丢失或已满怎么办?
"$TMPDIR" - 如果它未设置、丢失或已满怎么办?
当前目录 - 如果用户没有
w
权限,只是r
和x
?如果一个临时目录,无论它已经包含与
tar
存档和提取中同名的文件,都会覆盖它们怎么办?如果一个临时目录,不管它是什么不支持 Unix 文件系统,以及有关所有权、可执行位等的所有信息都会丢失怎么办?
另请注意,这也是其他程序中
-C
的常见选项,我首先想到的是Git和 make 。change directory
该
--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
.为了补充larsks的好答案,试图帮助消除围绕该
-C
选项的困惑:该选项的
tar
手册页说明-C
:所以,它不像
mv
- 它实际上是在告诉tar
改变到不同的工作目录。还要注意顺序很重要的一点。所以:file1
会将文件和file2
位置附加/path
到archive.tar
, 同时将追加
file1
和file2
从当前工作目录,然后file3
从file4
该/path
位置。--strip-components
并且-C
是 的独立且不相关的选项tar
。第一个影响存档文件的文件夹结构,一旦它们被提取,并指定用于指定存档外部文件-C
的工作目录。tar
我不确定我可以通过其他答案未涵盖的解释来说明什么。相反,我将尝试通过示例帮助您。
Arkadiusz Drabczyk 给出了GNU tar 手册中的示例, 其中您的存档包含一个大目录树(例如,all of
/usr
):并且您想深入了解存档并从低级子目录中提取文件:
手册没有说明的是,如果你说
然后
tar
会在当前目录中创建一个usr
目录,并在 中 创建一个include
子目录usr
,然后解压stdlib.h
到./usr/include
. 如果那是您想要的结果,那很好;使用该命令。但是,如果你想stdlib.h
在当前目录中,你需要然后可能
rmdir -p usr/include
。这是可行的,但它很乏味。--strip=2
为您节省大量打字。
或者-C
也可以与c
(小写 C)选项(创建档案)一起使用,这可能更容易理解。假设约翰、凯特、拉里和玛丽正在合作写一本书;他们分别在写第 1 章、第 2 章、第 3 章和第 4 章。John 和 Kate(仅)使用同一台计算机,他们希望将迄今为止所做的工作存档以发送给其他作者。您可以执行以下任一操作:但是这些会创建一个对目录路径 进行编码的存档
john/
。如果您这样做,那将是 Larry 和 Mary 使用或 提取档案的原因。 如果您想保存那些打扰他们(和/或将您的名字保存在档案之外;例如,出于隐私原因),那么您可以kate/
--strip=2
--strip=1
然后存档将只显示
chap1
和chap2
目录。