我在 Ubuntu 14.04 上创建了一个 tarball:
cd /tmp
tar -cfvz archive.tar.gz /folder
Run Code Online (Sandbox Code Playgroud)
现在我想将 tarball 中的特定文件夹(位于 tarball 中/tmp
)提取到特定文件夹中:
cd /tmp
tar -xfvz archive.tar.gz folder/in/archive -C /tmp/archive
Run Code Online (Sandbox Code Playgroud)
结果应该是一个/tmp
名为的新文件夹archive
。这样对吗?特别是缺少要提取的文件夹的斜杠(相对路径)以及要创建的文件夹的带前导斜杠的绝对路径?
kos*_*kos 14
由于您已经在/tmp
,您可以放弃该-C
选项(因为默认情况下tar
会在当前工作目录中提取文件)并添加--strip-components=2
:
tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive
Run Code Online (Sandbox Code Playgroud)
GNUtar
默认存储相对路径。
可以通过运行来检查档案是否使用相对路径tar -tf archive | head -n 1
,这将打印档案中第一个文件的路径;如果该文件的路径是相对路径,则存档中的所有文件都使用相对路径:
% tar -tf bash-4.3.tar.gz | head -n 1
bash-4.3/
Run Code Online (Sandbox Code Playgroud)
要从使用相对路径而不使用其祖先的存档中提取单个文件/文件夹到相对路径中,您需要两个选项:-C
和--strip-components=N
:在下面的示例中,存档bash-4.3.tar.gz
使用相对路径并包含一个bash-4.3/doc/bash.html
提取到相对路径中的文件path
(-C
指定解压文件的目录,--strip-components=2
指定解压文件的父级和父级的父级应该被忽略,所以在这种情况下只会bash.html
被解压到目标目录中):
% tree
.
??? bash-4.3.tar.gz
??? path
1 directory, 1 file
% tar -tf bash-4.3.tar.gz | grep -F 'bash.html'
bash-4.3/doc/bash.html
% tar -C path --strip-components=2 -zxf bash-4.3.tar.gz bash-4.3/doc/bash.html
% tree
.
??? bash-4.3.tar.gz
??? path
??? bash.html
1 directory, 2 files
Run Code Online (Sandbox Code Playgroud)
因此,回到您的命令,因为您已经在/tmp
,您可以放弃该-C
选项(因为默认情况下tar
会在当前工作目录中提取文件)并添加--strip-components=2
:
% tree
.
??? bash-4.3.tar.gz
??? path
1 directory, 1 file
% tar -tf bash-4.3.tar.gz | grep -F 'bash.html'
bash-4.3/doc/bash.html
% tar -C path --strip-components=2 -zxf bash-4.3.tar.gz bash-4.3/doc/bash.html
% tree
.
??? bash-4.3.tar.gz
??? path
??? bash.html
1 directory, 2 files
Run Code Online (Sandbox Code Playgroud)