通过 tar 流式传输目录时使用管道查看器

通过 tar 流式传输目录时使用管道查看器

我目前正在通过 tar 压缩目录后通过 SSH 传输该目录:

tar cz /path/to/foo | pv | ssh HOSTNAME 'tar xmz && some-cool-command'

问题是它pv不知道流的总大小,所以无法显示正确的进度条。我可以将其设置为的大小,/path/to/foo但由于流被压缩,所以这样不正确。

有没有办法解决这个问题并pv显示正确的进度条?

答案1

简短回答:不。你不知道tar(gzip实际上) 会压缩你的文件多少,直到你这样做。

您可以提前压缩驱动器上的文件,然后仅显示传输的进度条:

 tar cz /path/to/foo > /tmp/ar && pv /tmp/ar | ssh HOSTNAME 'tar xmz && some-cool-command'

但我不认为这是你想要实现的。或者你可能会满足于近似正如您所建议的,基于原始文件的大小。

答案2

我可以将其设置为的大小,/path/to/foo但由于流被压缩了,所以这并不正确。

然后让我们pv看看尚未压缩的流。

tar cz …管道到“内部”。你可以用以下方式gzip构建管道:targzip

tar c … | gzip -c | ssh …

z注意现在的选项中没有tar。放在和pv之间,它将看到尚未压缩的流:targzip

tar c … | pv | gzip -c | ssh …

pv由此可以估算出流的总大小。我会使用以下方法估算:

  • du --summarize --bytes /path/to/foo | cut -f 1
  • du --summarize --block-size=1 /path/to/foo | cut -f 1在 的情况下tar --sparse

我个人喜欢有pv -cN …前后对比gzip,这样我就可以粗略地计算压缩比,通常只是出于好奇或为了好玩。

相关内容