RubyでWindowsのtree似のスクリプトを作る

今度は、Windowsの「tree /F」を実行した時の表示と同じようになるようスクリプトを作ってみました。

# coding: cp932

def tree(path="./", pre="")
  puts path if pre == "" 
  list = Dir::entries path
  list.delete_if {|d| d =~ /^\./ }
  dir   = list.select {|a|   FileTest::directory?(File.join(path,a))}
  files = list.select {|a| ! FileTest::directory?(File.join(path,a))}
  files.each do |f|
    pre_str = pre+(dir.size==0 ? "  " : "│ ")
    puts pre_str+f
    puts pre_str if f == files.last
  end
  dir.flatten.each do |d|
    last = d == dir.last
    puts pre+(last ? "" : "")+""+d
    tree File.join(path,d), pre+(last ? "  " : "│ ")
  end
end

tree("c:/work/")

感想

冗長な記述が目立ちますが、まぁそのうち改善するとして、以外に手間がかかりました。
ソートの順番がファイル→ディレクトリの順ってところで悩みました。
結局、select使って分けてみました。

とりあえず、ここまで。