我目前正在通过 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
构建管道:tar
gzip
tar c … | gzip -c | ssh …
z
注意现在的选项中没有tar
。放在和pv
之间,它将看到尚未压缩的流:tar
gzip
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
,这样我就可以粗略地计算压缩比,通常只是出于好奇或为了好玩。