管道 tar 提取到 tar 创建

use*_*407 5 linux gzip pipe tar command-line-arguments

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

tar -xvf first.tar.gz subdir1/file1 subdir2/file2 | tar cf - | gzip > second.tar.gz
Run Code Online (Sandbox Code Playgroud)

有谁知道正确的语法吗?我尝试了很多变体,但都无济于事。

我也对使用 cpio 的想法持开放态度,但同样,我对如何正确使用语法感到困惑,据我所知,cpio 只接收档案或文件名,而不是文件。

任何帮助将不胜感激。

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

Mar*_*ler 5

我假设您正在使用或可以获得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
%
Run Code Online (Sandbox Code Playgroud)

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


Don*_*Gar 0

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

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

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

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