我在 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
# 注意:没有前导斜杠