【问题标题】:pipe tar extract into tar create管道 tar 提取到 tar 创建
【发布时间】:2023-03-03 19:12:01
【问题描述】:

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

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

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

我也对使用 cpio 的想法持开放态度,但我再次对如何正确地降低语法感到困惑,据我了解,cpio 只接收档案或文件名,而不是文件。

任何帮助将不胜感激。

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

【问题讨论】:

  • 您要从第一个 tarball 中提取的文件的文件名中是否有某种模式?
  • 我已经编辑了下面的 GNU tar 和 BSD tar 解决方案,以显示我的测试都允许删除或包含多个文件的规范。所以这两种解决方案都可以解决您的问题。

标签: linux gzip pipe command-line-arguments tar


【解决方案1】:

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

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

【讨论】:

  • 这很好,我建议添加一点。而不是 > y.tar 只是管道到下一个 tar。例如cat x.tar | tar f - --delete b c | tar tf -
【解决方案2】:

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

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
%

【讨论】:

  • 这也行得通!虽然仅适用于 BSD tar。不幸的是,它不适用于 GNU tar。所以两者都有一个解决方案,但是这个 BSD tar 提供了一个更接近要求的解决方案。
【解决方案3】:

以上解决方案都不适合我,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/directory 仍然在新的 tar 中。

【讨论】:

    【解决方案4】:

    解压时,tar 通常将解压后的文件写入磁盘,而不是输出流。您可以使用 -O 或 --to-stdout 让它将文件写入标准输出,但文件之间不会有中断,也不会以任何方式知道一个结束什么时候开始。

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

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

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

    【讨论】:

    • 如果需要在内存中操作,解压到 ram 磁盘将在 shell 中工作。
    • 可以使用 GNU tar(没有 ram 磁盘)。看我的回答。
    • BSD tar 也可以(@fvwmer 的回答)。当你说“没有办法做到这一点”时要更加小心。
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多