我在 Ubuntu 14.04 上创建了一个压缩包:
cd /tmp
tar -cfvz archive.tar.gz /folder
现在我想将 tarball 中的特定文件夹(在 tarball 中位于/tmp
)中提取到特定文件夹中:
cd /tmp
tar -xfvz archive.tar.gz folder/in/archive -C /tmp/archive
结果应该是被/tmp
调用的新文件夹archive
。这个对吗?特别是要提取的文件夹的缺失斜杠(相对路径)以及要创建的文件夹的前导斜杠的绝对路径?
Tl;博士
由于您已经在
/tmp
其中,您可以放弃该-C
选项(因为默认情况下tar
将提取当前工作目录中的文件)并添加--strip-components=2
:GNU
tar
默认存储相对路径。可以通过运行检查存档是否使用相对路径
tar -tf archive | head -n 1
,它将打印存档中第一个文件的路径;如果该文件的路径是相对路径,则存档中的所有文件都使用相对路径:要从使用相对路径而不使用其祖先的存档中提取单个文件/文件夹到相对路径中,您需要两个选项:
-C
和--strip-components=N
:在下面的示例中,存档bash-4.3.tar.gz
使用相对路径并包含bash-4.3/doc/bash.html
提取到相对路径中的文件path
(-C
指定解压文件所在的目录,--strip-components=2
指定解压文件的父级和父级应该被忽略,所以在这种情况下只会bash.html
被解压到目标目录):所以,回到你的命令,因为你已经在
/tmp
里面了,你可以放弃这个-C
选项(因为默认情况下tar
会提取当前工作目录中的文件)并添加--strip-components=2
:tar
存储相对路径如果您需要提取特定文件夹,请查看 tar 文件中的内容:
并记下确切的文件名。
tar -xvf foo.tar folder/in/archive
# 注意:没有前导斜杠