標準出力からコマンドの残り時間を推定するスクリプト eta.rb


 CUI プログラミング習作です。標準出力からコマンドの残り時間を推定するスクリプト eta.rb を作りました。

 cp の残り時間が推定できたら良いなあドリブンでスタートしたんですが、まだ実用性ゼロ(笑)


使い方


 第1引数に、予想されるコマンドの出力の行数を指定し、パイプでつなぎます。


$ yes | head -n 300 | ruby eta.rb 300
y
y
(省略)
y

[*** ETA : 0.007234 sec ***]

y
y
(省略)
y

[*** ETA : 0.001919 sec ***]

y
y
(省略)
y

[*** ETA : 0.0 sec ***]

ソースコード

eta.eb


maxcount = ARGV[0].to_i

count = 0
prevtime = Time.now
frequency = 100
while line = STDIN.gets
count += 1
maxcount2 = [count, maxcount].max;
rate = count.to_f / maxcount2.to_f;
STDOUT.write line

if (count % frequency == 0)
unittime = (Time.now - prevtime) / frequency
rest = maxcount2 - count
eta = rest * unittime
puts
puts "[\033[1;31m*** ETA : " + eta.to_s + " sec ***\033[0m]"
puts
prevtime = Time.now
end
end
STDOUT.write "\n"


 実際 cp でやるときは、引数に `du /path/to -a -I ".?*" | wc -l` とか渡してやるのかなとか思ったり。テラメンドスw 誰か応用例考えてください(笑)