2012-07-13 38 views
2

我现在有一个tar.gz,我想从中提取一个或两个文件,并将它们打包/添加到新的tar.gz中,一次性完成。当然,我可以保存到一个临时文件并使用它,但ABSOLUTE的要求是不需要任何中间文件输出即管道。换句话说,我想是类似下面的伪代码(显然是语法不正确)管道沥青提取到焦油创建

tar -xvf first.tar.gz subdir1/file1 subdir2/file2 | tar cf - | gzip > second.tar.gz 

有谁知道这个正确的语法?我尝试过很多变种,但无济于事。

我对使用cpio的想法也非常开放,但是又一次,我被如何正确地获取语法所困扰,并且从我所了解的情况来看,cpio只采用档案或文件名,而不是文件。

任何帮助将不胜感激。

编辑:tarball里面没有特定的文件名模式来提取。鉴于BSD和GNU tar一次只能搜索一种模式,我不确定是否可以分别使用include/exclude标志。

+0

你要的文件从第一个压缩包中提取文件名有一些模式? – fvwmer 2012-07-13 02:47:44

+0

我编辑了下面的GNU tar和BSD tar解决方案,以显示我的测试,它们都允许指定多个文件来删除或包含。所以这两种解决方案都适用于您的问题 – 2012-07-14 02:53:39

回答

0

解压缩时,tar通常会将解压后的文件写入磁盘,而不是输出流。您可以使用-O或--to-stdout来将文件写入标准输出,但文件之间不会有中断或者知道何时结束而另一个开始。

另外,tar的创建选项只能从磁盘读取文件,而不能从stdin读取文件。这是有道理的,因为前面提到的知道何时一个文件结束而另一个文件开始的问题。

这意味着无法按照自己想要的方式从命令行执行此操作。

但是,我打赌你可以使用库来编写perl或python脚本,你可以在内存中严格操作。

+0

如果在内存中操作是必需的,则解压缩到ram磁盘将在shell中工作。 – 2012-07-13 03:39:11

+0

GNU tar(没有RAM磁盘)是可能的。看到我的答案。 – 2012-07-13 15:20:42

+0

BSD焦油也可以(@ fvwmer的回答)。当你说“没有办法做到这一点”时要小心。 – 2012-07-13 17:08:15

2

我假设您正在使用或者您可以获得GNU tar

您可以使用--delete选项将一个tar文件处理为另一个。例如:

% tar cf x.tar a b c d 
% tar tf x.tar 
a 
b 
c 
d 
% cat x.tar | tar f - --delete b c > y.tar 
% tar tf y.tar 
a 
d 
% 

请注意,您可以指定多个要删除的名称。然后你只需要弄清楚如何在命令行中指定所有文件,而不是要保留的文件。

1

如果你知道你要提取的文件名模式,试试这个:

tar zcf second.tar.gz --include='filepattern' @first.tar.gz 

这里是在多个文件中包含的一个例子:

% tar cf x.tar a b c d 
% tar tf x.tar 
a 
b 
c 
d 
% cat x.tar | tar cf - --include='a' --include='d' @- > y.tar 
% tar tf y.tar 
a 
d 
% 
+0

这也行得通!尽管只适用于BSD焦油。不幸的是,它不适用于GNU焦油。所以两者都有一个解决方案,但是这个BSD tar提供了一个更接近要求的解决方案。 – 2012-07-13 15:26:55