【问题标题】:Bash Piping PV - move file and (un)tarBash Piping PV - 移动文件和(un)tar
【发布时间】:2014-04-11 11:26:17
【问题描述】:

我第一次真正介绍在 bash 中注入 'pv' (Pipe Viewer) 以获得一些用户反馈。我还尝试搜索有关 PV 的其他帖子,但没有找到我需要的内容。这可能是一个简单的答案,希望其他人会觉得有用......

我的目标是传输(一个大型网络文件)然后解压缩(在本例中为 tar)

为方便起见,已安装网络文件夹。我可以

pv /root/networkshare/someFile.tar > /tmp/someFile.tar

然后

pv someFile.tar | tar xf -

所以我试图通过管道链接它们,但似乎无法正确处理。我相信我很接近

pv -cN transfer /root/networkshare/someFile.tar > /tmp/someFile.tar | pv -cN untar tar xf - 

只是一个 FWIW,如果我创建一个依赖指令它确实有效,我真的想了解更多管道结构。例如,如果网络传输成功,以下将产生预期的结果:

pv -cN transfer /root/networkshare/someFile.tar > /tmp/someFile.tar && pv -cN untar /tmp/someFile.tar | tar xf - 

我会很感激最后的“轻推”以及我所缺少的。一如既往的感谢。

【问题讨论】:

  • @AaronDigulla 一个很棒的实用工具catonmat.net/blog/unix-utilities-pipe-viewer
  • 我无法想象 -1 的用途,但非常感谢。
  • ...为什么不只是pv /root/networkshare/someFile.tar | tar x
  • @Kevin 只是因为我希望监控与“解压缩”分开的网络传输部分,否则当然可以。
  • 这真的没有意义。进入 tar 的速率将与来自网络的速率完全相同(几乎可以肯定受到网络速度的限制)。如果你在一个这样的管道中同时执行它们,你可以跳过额外的、不必要的临时文件。

标签: bash pipe tar


【解决方案1】:

首先,非常感谢@Aaron 迫使我考虑 stdin | 之间的根本区别。标准输出和重定向。正如他所说,当您 > 标准输出时,您就“完成”了。

特定于光伏管道,有一些过载用途让我有些困惑,特别是在如下使用时:

pv infile > outfile

这里 pv 的行为类似于“猫”。您应该考虑的是非重载函数调用如下(伪)

command1 | pv | command2

这里 pv 只是作为衡量进度的实用程序(如果它知道预期的指标)。我会提供我需要的东西并将其分解。

最后的 bash 命令是:

pv -cN transfer /root/networkshare/someFile.tar | pv -cN untar -s $(du -sb /root/networkshare/someFile.tar | awk '{print $1}') | tar xf - -C /tmp/someDir/

它比看起来要简单得多,我将对其进行分解: 我们从使用 stdin -> stdout 的传输开始。我们希望将传输通过管道传输到下一个命令 (un)tar,因此我们希望它保留在标准输出中。通过使用 pv,我们可以监控进度,并传入文件。这里 pv 将获取文件大小,以便计算 ETA。这实际上是 command1,因为这里 pv 充当“猫”。

这个“猫”通过管道将标准输出传送到下一位,

....pv -cN untar -s $(du -sb /root/networkshare/someFile.tar | awk '{print $1}')

因为这是第一节的标准输出,所以 pv 还不知道文件大小。为了获得一些有意义的 ETA,我们只需使用“du”调用获取原始文件大小,并将其作为“-s”传递给 pv。这里 pv 是在上面显示的 command1 (cat) 和 command2 (tar) 之间更经典的中间人。

然后我们将这一切传递给 tar 进程并确定我们想要的解压缩数据的最终目的地。

对于大文件,此实用程序非常适合了解正在发生的事情。

【讨论】:

  • pv acts like 'cat' 是什么意思?使用示例command 1 | pv | command 2tar -czvf tar.gz somefiles 的构造是什么?
【解决方案2】:

如果您写cmd > file | cmd2,那么cmd2 将一无所获,因为> file 已经将cmd 的所有输出定向到file

试试tee:

cmd | tee file | cmd2

tee 将所有输入复制到一个文件中,然后将标准输入传递给管道中的下一个进程。

【讨论】:

  • 这似乎不是正确的方法,尤其是当它要复制大文件上的所有输入时。不过,谢谢你的观点。
  • 您打算如何在不制作副本的情况下获取file 中的数据的副本? :-)
  • @AaronDigulla - 你的意思是说pv 命令应该构造为command 1 | pv | command 2?如果是,tar -czvf file.gz somefiles 的构造是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
相关资源
最近更新 更多