linux创造管道文件,关于linux:管道tar提取到tar创建

我现在有一个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一次只能搜索一个模式,我不确定是否可以分别使用include/exclude标志。

你要从第一个tarball中提取的文件在文件名中是否有某种模式?

我已经编辑了下面的GNU tar和BSD tar解决方案,以展示我的测试,它们都允许删除或包含多个文件的规范。所以这两种解决方案都适用于您的问题。

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

%

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

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

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焦油。不幸的是,它对GNU TAR不起作用。所以两者都有解决方案,但是这个BSD tar提供了一个更接近所要求的解决方案。

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

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

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

不过,我敢打赌,您可以使用库编写Perl或Python脚本,您可以在内存中严格地操作这些库。

如果必须在内存中操作,那么解压到RAM磁盘将在shell中工作。

可以使用GNU tar(无RAM磁盘)。看看我的答案。

也有可能使用BSD tar(@fvwmer的答案)。当你说"没有办法做到这一点"时,要更加小心。

我被纠正了!非常聪明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值