Linux 将焦油萃取物导入焦油中

Linux 将焦油萃取物导入焦油中,linux,gzip,pipe,command-line-arguments,tar,Linux,Gzip,Pipe,Command Line Arguments,Tar,我现在有一个tar.gz,我只想从中提取一两个文件,然后打包/添加到一个新的tar.gz中,一次完成。当然,我可以只保存到一个临时文件并使用它,但绝对的要求是在没有任何中间文件输出(即管道)的情况下完成这一切。换句话说,我想要的是下面的伪代码(显然语法不正确) 有人知道这个的正确语法吗?我尝试过许多变体,但都没有用 我对使用cpio的想法也非常开放,但同样,我被如何正确地记下语法难住了。据我所知,cpio只接收档案或文件名,而不接收文件 任何帮助都将不胜感激 编辑:tarball中没有要提取的特

我现在有一个tar.gz,我只想从中提取一两个文件,然后打包/添加到一个新的tar.gz中,一次完成。当然,我可以只保存到一个临时文件并使用它,但绝对的要求是在没有任何中间文件输出(即管道)的情况下完成这一切。换句话说,我想要的是下面的伪代码(显然语法不正确)

有人知道这个的正确语法吗?我尝试过许多变体,但都没有用

我对使用cpio的想法也非常开放,但同样,我被如何正确地记下语法难住了。据我所知,cpio只接收档案或文件名,而不接收文件

任何帮助都将不胜感激


编辑:tarball中没有要提取的特定文件名模式。考虑到BSD和GNU tar一次只能搜索一个模式,我不确定是否可以分别使用include/exclude标志。

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

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

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


然而,我打赌您可以使用可以在内存中严格操作的库编写perl或python脚本。

我假设您正在使用或可以使用

您可以使用
--delete
选项将一个tar文件处理为另一个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
%

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

如果您知道要提取的文件名模式,请尝试以下操作:

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
%

上述解决方案对我都不起作用,tar抱怨说创建了一个空的归档

相反,我只是使用了&:

tar -xf first.tar.gz subdir1/file1 subdir2/file2 && tar -cvf second.tar --remove-files subdir1/file1 subdir2/file2 
其中--remove files是添加到存档后删除文件的选项

我发现的另一种有效方法是:

tar -cf second.tar `tar -tf first.tar.gz /desired/directory`

请注意,保留整个目录上下文,因此/desired/目录仍然在新的tar中。

您要从第一个tarball中提取的文件在其文件名中是否有一些模式?我编辑了下面的GNU tar和BSD tar解决方案,以显示我的测试,这两个解决方案都允许删除或包含多个文件的规范。因此,这两种解决方案都能解决您的问题。如果必须在内存中操作,那么提取到ram磁盘将在shell中工作。使用GNU tar(没有ram磁盘)是可能的。请看我的答案。BSD tar也有可能(@fvwmer的答案)。当你说“没有办法做到这一点”时,要更加小心。这也行!虽然只适用于BSD焦油。不幸的是,它不适用于GNU tar。所以两者都有一个解决方案,但是这个BSD tar提供了一个更接近要求的解决方案。这很好,我建议添加一点。而不是>y.tar,只需将管道连接到下一个tar。e、 g.
cat x.tar | tar f----删除b c | tar tf-
tar -cf second.tar `tar -tf first.tar.gz /desired/directory`