linux 将焦油提取物输送到焦油生成器

dwbf0jvd  于 2023-03-07  发布在  Linux
关注(0)|答案(4)|浏览(110)

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

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

有人知道这个的正确语法吗?我试过很多变体,但都无济于事。
我也非常愿意接受使用cpio的想法,但同样,我被如何正确地理解语法所难住了,而且据我所知,cpio只接收归档文件或文件名,而不接收文件。
任何帮助都将不胜感激。
编辑:在压缩包中没有特定的文件名模式可以提取,考虑到BSD和GNU tar一次只能搜索一个模式,我不确定是否有可能分别使用include/exclude标志。

f1tvaqid

f1tvaqid1#

我假设您正在使用或者您可以获得GNU tar
您可以使用--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
%

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

kmynzznz

kmynzznz2#

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

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
%
zaqlnxep

zaqlnxep3#

上面的解决方案对我都不起作用,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中。

jhdbpxl9

jhdbpxl94#

解压缩时,tar通常将解压缩的文件写入磁盘,而不是输出流,您可以使用-O或--to-stdout命令将文件写入stdout,但文件之间不会出现中断,也不会有任何方法来知道一个文件何时结束,另一个文件何时开始。
另外,tar的create选项只能从磁盘读取文件,而不能从stdin读取,这是有意义的,因为前面提到的问题是知道一个文件何时结束,另一个文件何时开始。
这意味着没有办法从命令行以您想要的方式完成此操作。
然而,我敢打赌,你可以使用那些可以在内存中严格操作的库来编写perl或python脚本。

相关问题