Bash Piping PV - 移动文件和(un)tar

时间:2014-04-11 11:26:18

标签: bash pipe tar

我正在第一次真正介绍在bash中注入'pv'(Pipe Viewer)以获得一些用户反馈。我也试图搜索关于光伏的其他帖子,但没找到我需要的东西。这可能是其他人希望找到有用的简单答案......

我的目标是传输(大型网络文件)然后解压缩(在本例中为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 - 

我很欣赏最后的“轻推”以及我所缺少的东西。一如既往地谢谢。

2 个答案:

答案 0 :(得分:2)

首先,快速感谢@Aaron强迫我考虑stdin |之间的根本区别标准输出和重定向。正如他所说,当你> stdout,你已经完成了#34;。

对于PV管道而言,有一些过载用途会引起我一些困惑,特别是在使用时如下:

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的转移开始 - >标准输出。我们想将传输传输到下一个命令(un)tar,所以我们希望它保留在stdout中。通过使用pv,我们可以监视进度,并传入文件。这里pv将获取文件大小,以便它可以计算ETA。这实际上是命令1,因为这里的pv充当了' cat'。

这只猫'将标准输出到下一位,

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

因为这是第一部分的stdout,pv还不知道文件大小。为了获得一些有意义的ETA,我们只需使用' du'来获取原始文件大小。打电话并将其作为' -s'进入pv。在这里,pv扮演的是更为经典的中间人,如上图所示,在command1(cat)和command2(tar)之间。

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

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

答案 1 :(得分:0)

如果您撰写cmd > file | cmd2,那么cmd2已经将> file的所有输出定向到cmdfile将无法获取任何内容。

尝试tee

cmd | tee file | cmd2

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