太长不看

太长不看

我在 Ubuntu 14.04 上创建了一个 tarball:

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。这是正确的吗?特别是要提取的文件夹缺少斜杠(相对路径)和要创建的文件夹以斜杠开头的绝对路径?

答案1

太长不看

由于您已经进入/tmp,您可以放弃该-C选项(因为默认情况下tar将提取当前工作目录中的文件)并添加--strip-components=2

tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive

GNUtar默认存储相对路径。

可以通过运行来检查档案是否使用相对路径tar -tf archive | head -n 1,这将打印档案中第一个文件的路径;如果该文件的路径是相对路径,则档案中的所有文件都使用相对路径:

% tar -tf bash-4.3.tar.gz | head -n 1
bash-4.3/

要从使用相对路径的存档中提取单个文件/文件夹(而不将其祖先提取到相对路径中),您需要两个选项:-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

因此,回到您的命令,由于您已经在命令中/tmp,您可以丢弃该-C选项(因为默认情况下tar将提取当前工作目录中的文件)并添加--strip-components=2

tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive

答案2

tar存储相对路径

如果需要提取特定文件夹,请查看 tar 文件中的内容:

tar -tvf archive.tar.gz

并记下确切的文件名。 tar -xvf foo.tar folder/in/archive
# 注意:没有前导斜杠

相关内容