如何从大型tar.gz存档中提取单个文件夹?


131

我正在5GB存档上使用此命令

tar -zxvf archive.tar.gz /folder/in/archive

这是正确的方法吗?似乎永远没有命令行输出...


您使用绝对路径还是相对路径?应该是相对的,除了看起来正确之外。您让它运行了多长时间?您的系统有多好?在高速计算机上至少需要几分钟。可能一个小时或更长时间?我正在运行测试。
凯文(Kevin)

是的,它在大约1小时后完成,但是绝对路径错误,您是正确的。
加勒特·霍尔

5
在Linux上,您可以观察到归档文件tar有多远cat /proc/$(pidof tar)/fdinfo/0(如果您tar正在运行多个进程,请修改命令)。
Gilles 2012年

重要的部分也不是结尾斜杠。使用folder/folder2/将不起作用。
Marki555 '17

Answers:


145

tar默认存储相对路径。GNU tar甚至这样说,如果您尝试存储绝对路径:

tar -cf foo.tar /home/foo
tar: Removing leading `/' from member names

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

tar -tvf foo.tar

并注意确切的文件名。对于我的foo.tar文件,我可以/home/foo/bar这样说:

tar -xvf foo.tar home/foo/bar # Note: no leading slash

所以不,您发布的方式(不一定)不是正确的方式。您必须省去前导斜线。如果要模拟绝对路径,请cd /首先执行并确保您是超级用户。同样,这样做是一样的:

tar -C / -xvf foo.tar home/foo/bar # -C is the ‘change directory’ option

tar将路径转换为相对路径有非常明显的充分理由。一种是在原始来源以外的地方还原档案的功能。另一个是安全性。您可以提取档案,期望其文件出现在当前工作目录中,而错误地覆盖其他地方的系统文件(或您自己的工作)。

注意:如果使用该-P选项,tar 存档绝对路径。因此,在提取前检查大型档案的内容总是值得的。


36
--strip-components=N在这里可能对某些人有用。
Acumenus 2014年

2
在我的情况下,有必要写./foldername/而不是写foldername,我想这是因为当我创建tar时使用了它,tar -cvf santi.tar ./*当我“列出”了tar时,这就是它的意思drwxr-xr-x santi/santi 0 2016-04-11 09:42 ./foldername/
santiago arizti

1
大约.gz呢?
彼得·克劳斯

1
@PeterKrauss更改-xvf-xzvf(添加-z选项),并且显然foo.tar更改为foo.tar.gz或您的存档命名。这同样适用于-j(BZ2)和最近的一些版本中,-J(XZ)。否则,类似的管道zcat foo.tar.gz | tar -xvf - …也可以工作。
Alexios'8

请记住,如果您对提取过程中的所有冗长输出感到厌倦,请跳过v所有示例。例如tar -tf foo.tartar -xf foo.tar ...
Bo R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.