将pipe道焦油提取成焦油创build

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

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

有谁知道这个适当的语法? 我已经尝试了很多变种,但无济于事。

我也很喜欢使用cpio的想法,但是又一次,我被如何正确地获得语法所困扰,并且从我的理解中,cpio只会使用档案或文件名,而不是文件。

任何帮助将不胜感激。

编辑:在压缩包内没有特定的文件名模式来提取。 鉴于BSD和GNU tar一次只能search一个模式,我不确定是否甚至可以分别使用include / exclude标志。

Solutions Collecting From Web of "将pipe道焦油提取成焦油创build"

我假设你正在使用或者你可以得到GNU焦油 。

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

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

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

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

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

这是一个显示包含多个文件的例子:

 % tar cf x.tar abcd % 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 % 

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

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

这意味着没有办法从命令行以您想要的方式执行此操作。

不过,我敢打赌,你可以使用库来编写一个perl或python脚本,你可以在内存中严格操作。