Edited at

進行状況をプログレスバーで表示

More than 3 years have passed since last update.

Homebrewの進行状況、たとえば

$ brew install node.js

==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/node-0.10.2
######################################################################## 100.0%

こんな感じのプログレスバー表示を行うメソッドです。


progress_bar メソッド(幅80文字版)


progress_80.rb

#!/usr/bin/env ruby

# coding: utf-8
$stdout.sync = true #書いておかないと出力がバッファに溜め込まれるかも

def progress_bar(i, max = 100)
i = max if i > max
rest_size = 1 + 5 + 1 # space + progress_num + %
bar_width = 79 - rest_size # (width - 1) - rest_size = 72
percent = i * 100.0 / max
bar_length = i * bar_width.to_f / max
bar_str = ('#' * bar_length).ljust(bar_width)
# bar_str = '%-*s' % [bar_width, ('#' * bar_length)]
progress_num = '%3.1f' % percent
print "\r#{bar_str} #{'%5s' % progress_num}%"
end

(0..1000).each do |j|
sleep 0.001
progress_bar(j, 1000)
end
puts


実行すると

$ ruby progress_80.rb 

######################################################################## 100.0%

という感じになります。実際に動かして、プログレスバーが伸びていく様子を確認してください。

なお、max を与えないと max = 100 になります。

つまり、i がそのままパーセントを表している場合は引数を一つだけにすることが出来ます。

(0..100).each do |j|

sleep 0.01
progress_bar(j)
end
puts


progress_bar メソッド(幅可変版)

(2015/12/23追記)

先ほどの progress_bar メソッドはコンソール幅が80文字決め打ちでしたが、そうじゃない環境だとあまり良くないですよね。コンソール幅は IO.console_size で取得できるのでこれを利用します(冒頭で require 'io/console/size' が必要)。


console_size -> [Integer, Integer] [added by io/console/size]

端末のサイズを [rows, columns] で返します。

io/console が利用できない場合は、IO.default_console_size の値を返します。


require 'io/console/size'

$stdout.sync = true

def progress_bar(i, max = 100)
height, width = IO.console_size # height は使ってませんが説明のために記載
i = max if i > max
rest_size = 1 + 5 + 1 # space + progress_num + %
bar_width = (width - 1) - rest_size
percent = i * 100.0 / max
bar_length = i * bar_width.to_f / max
bar_str = ('#' * bar_length).ljust(bar_width)
progress_num = '%3.1f' % percent
print "\r#{bar_str} #{'%5s' % progress_num}%"
end

(2015/12/23追記ここまで)


rubygems

gemになっているものもいろいろあります。

The Ruby Toolbox - CLI Progress Bars: Indicate the progress of long-running tasks in your command line utilities


なお

この投稿はこちらの二匹目のドジョウですw

CLIでプログレスバーみたいのを出力する - Qiita

ただし、このプログレスバーは以前から個人的に使ってましたw

このスクリプトとかで(出力は若干違いますが

NHK語学講座のラジオ番組ストリーミングを取得するRubyスクリプトgogakuondemand.rb(v3.5 '14/3/31更新版) - 別館 子子子子子子(ねこのここねこ)