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

Bash管道PV-移动文件和(un)tar,bash,pipe,tar,Bash,Pipe,Tar,我在bash中第一次真正介绍了注入“pv”(pv),以获得一些用户反馈。我还试图搜索其他关于PV的帖子,但没有找到我需要的。这可能是一个简单的答案,希望其他人会发现有用的 我的目标是传输(一个大的网络文件),然后解压缩(在本例中是tar) 为方便起见,已装入网络文件夹。我能 pv /root/networkshare/someFile.tar > /tmp/someFile.tar 然后 所以我试着用管道把它们连接起来,但似乎并没有正确的方法。我相信我和你很亲近 pv -cN trans

我在bash中第一次真正介绍了注入“pv”(pv),以获得一些用户反馈。我还试图搜索其他关于PV的帖子,但没有找到我需要的。这可能是一个简单的答案,希望其他人会发现有用的

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

为方便起见,已装入网络文件夹。我能

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

所以我试着用管道把它们连接起来,但似乎并没有正确的方法。我相信我和你很亲近

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 - 

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

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

尝试
tee

cmd | tee file | cmd2

<代码> TE/<代码>将所有输入拷贝到文件中,然后将标准输入传递到管道中的下一个进程。

首先,快速感谢@亚伦,强迫我考虑STDIN STDUT和重定向之间的根本区别。正如他所说的,当你完成任务时,你就“完成了”

具体到光伏管道,有一些过载使用引起了我的一些困惑,特别是当使用如下:

pv infile > outfile
在这里,pv的行为就像“猫”。您应该考虑的是非过载函数调用如下(pSueDo)

在这里,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,因此我们希望它保持在stdout中。通过使用pv,我们可以监控进度,并将其传递到文件中。这里pv将获取文件大小,以便计算ETA。这实际上是命令1,因为pv在这里充当“cat”

这只“猫”将标准管道输送到下一位

....pv -cN untar -s $(du -sb /root/networkshare/someFile.tar | awk '{print $1}')
由于这是第一节的标准输出,pv还不知道文件大小。为了获得一些有意义的ETA,我们只需通过'du'调用获取原始文件大小,并将其作为'-s'传入pv。在这里,pv在command1(cat)和command2(tar)之间扮演更经典的中间人角色,如上图所示

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


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

@AaronDigulla这是一个非常适合的实用程序,我无法想象-1的用途,但非常感谢。。。。为什么不干脆
pv/root/networkshare/someFile.tar | tar x
?@Kevin只是因为我想监视网络传输部分和“未出错”部分分开,否则肯定是这样。这真的没有意义。进入tar的速率将与离开网络的速率完全相同(几乎肯定会受到网络速度的限制)。如果你在一个管道中同时做这两件事,你就可以跳过多余的、不必要的临时文件。这似乎不是正确的方法,尤其是当它要复制大文件上的所有输入时。不过,感谢您的观点。您计划如何在不复制数据的情况下获取
文件中数据的副本?:-)@Aarondigula-您的意思是说
pv
命令应构造为
command 1 | pv | command 2
?如果是,那么构造
tar-czvf file.gz somefiles
是什么意思?您所说的
pv的行为类似于“cat”
?使用示例
command 1 | pv | command 2
,构建什么
tar-czvf tar.gz somefiles
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/
....pv -cN untar -s $(du -sb /root/networkshare/someFile.tar | awk '{print $1}')