从 tarball 中提取特定文件夹到特定文件夹

mus*_*ach 9 command-line tar

我在 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

Tl;博士

由于您已经在/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)