2009年4月23日木曜日

即席 tail

Windowsなマシンでちょっと必要になったので書いてみた。

tail.rb
#!ruby -Ku

class Tail
def initialize(filename)
@filename = filename
end

def run
@interrupted = false
size = File.size(@filename)
size = print_head(size)
until @interrupted
size = print_diff(size)
sleep 0.5
end
end

def max(x, y)
x > y ? x : y
end

def print_head(size)
File.open(@filename, 'rb') do |f|
f.seek(max(size - 1024, 0))
print f.read
return f.tell
end
end

def print_diff(size)
latest = File.size(@filename)
return size if latest == size

if latest < size
puts
puts "truncated..."
puts
return print_head(latest)
end

File.open(@filename, 'rb') do |f|
f.seek(size)
print f.read
return f.tell
end
end

def interrupt
puts "^C"
@interrupted = true;
end
end

if $0 == __FILE__
tail = Tail.new(File.expand_path(ARGV[0]))
Signal.trap(:INT){ tail.interrupt }
tail.run
end

0 件のコメント:

コメントを投稿