我想确保我理解以下代码:
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 个元素组成:a
、b
、 和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=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
-C
选项告诉 tar 在运行请求的操作之前更改到给定目录,提取但也归档。在这条评论
你问:
要求 tar 进行 cd:为什么是 cd?我想问一下,为什么不只是mv?
为什么你认为这样mv
更好?您希望首先将 tar 存档解压到哪个目录:
/tmp - 如果丢失或已满怎么办?
“$TMPDIR” - 如果未设置、丢失或已满怎么办?
当前目录 - 如果用户没有
w
权限,只有r
和 该怎么办x
?如果临时目录(无论它是什么)已经包含与存档中同名的文件
tar
并提取将覆盖它们怎么办?如果临时目录(无论它是什么)不支持 Unix 文件系统,并且有关所有权、可执行位等的所有信息都会丢失怎么办?
答案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
位置,同时/path
archive.tar
tar r -f archive.tar file1 file2 -C /path file3 file4
将从当前工作目录附加file1
and ,然后从该位置附加and 。file2
file3
file4
/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
然后tar
会usr
在当前目录下创建一个目录,并 include
在 中创建一个子目录usr
,然后解压stdlib.h
到./usr/include
.如果这就是你想要的结果,那就好;使用该命令。但是,如果您想stdlib.h
在当前目录中,则需要
$ mv usr/include/stdlib.h .
然后可能rmdir -p usr/include
。这是可行的,但很乏味。
--strip=2
节省您大量的打字时间。
-C
c
也可以与(小写 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
然后存档将仅显示chap1
和chap2
目录。