瞎扯淡 好奇 wget 那种百分比的进度是如何打印出来的

huacnlee · 2011年11月25日 · 最后由 mvj3 回复于 2012年02月04日 · 7491 次阅读

有时候需要跑数据,我们希望在控制台输出进度状态,我一般都是这么搞的

loading...............done.
loading..........................................................................................done.

但是像 wget 这类软件的打印信息是这样的

$ wget http://bar.com/foo.zip
[ <=================>         ]  83%   530K/s   in 0.05s 

<=================> 是会变化,但是还是在同一个地方 83% 这处也是的

谁知道怎么搞这个?

print "|====         |\r"
$stdout.flush
sleep 2
print "|======       |\r"
$stdout.flush
sleep 2
print "|=============|\n" 

除了\r回行首然后覆盖掉,也可以用 ANSI terminal 的 Cursor Control http://www.termsys.demon.co.uk/vtansi.htm

print "10%\e[3D12%" 

\e[3D 就是回退 3 格

就是用\r实现的,做爬虫的时候写过一个带进度条的 each:

class Array
  def each_with_process
    start = Time.now
    each_with_index do |item, index|
      yield(item)
      count = index + 1
      avg = (Time.now - start) * 1.0 / (index + 1)
      eta = ((size - count) * avg) / 60

      printf "\r%.2f %%, %d / %d, AVG: %f sec, ETA: %.0f min, PASSED: %d min ... ", count * 100.0 / size, count, size, avg, eta, (Time.now - start) / 60

    end
  end
end

哈哈,会了,谢啦

100.times do |i|
  print ("="*i).ljust(100) + "#{i}%\r"
  $stdout.flush
  sleep 1
end

#6 楼 @huacnlee ljust 用得很性感啊!

flush 是用来干啥的?貌似没有用啊

我擦,高手云集啊。没想到 hoooooooooopo 也会,长江后浪推前浪,我已死在沙滩上。。。

来一个无关的 =。= --> https://gist.github.com/1261488

proc do |line|
  (1..line).each do |num|
    puts "#{' '*(line - num)}#{('1'*num).to_i**2}"
  end
end.call((ARGV[0] || 36).to_i)

@huacnlee 图片 URL 里有中文无法显示?

#10 楼 @mvj3 饿,中文 URL 的无法提出图片

#10 楼 @mvj3 您的 url 有问题了。。。。。

#10 楼 @mvj3 命令行颜色有啥文档规定么?

#14 楼 @jinleileiking 你是想要打印有颜色文字么? 可以用 colorize 这个 Gem

#15 楼 @huacnlee @jinleileiking 我用的这个https://github.com/busyloop/lolcat,只是为了一个彩虹式的展现效果~

#13 楼 @jinleileiking 坐等支持中文 URL 解析~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号