我正在第一次真正介绍在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 -
我很欣赏最后的“轻推”以及我所缺少的东西。一如既往地谢谢。
答案 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
的所有输出定向到cmd
,file
将无法获取任何内容。
尝试tee
:
cmd | tee file | cmd2
tee
将所有输入的副本复制到文件中,然后将标准输入传递给管道中的下一个进程。