Rubyでファイルのツリー構造を出力する

qiita.com
これを見て Ruby でもやってみたくなりました。
 

実行例

<kaki-utils>
  ├<lib>
  │  └<kaki>
  │     ├<utils>
  │     │  ├add_methods.rb
  │     │  ├all.rb
  │     │  ├check_fname_overlapping.rb
  │     │  ├es.rb
  │     │  ├imgsuffix.rb
  │     │  ├nest_loop.rb
  │     │  ├po.rb
  │     │  ├rec_decimal.rb
  │     │  ├retry.rb
  │     │  └safe_mkdir.rb
  │     └utils.rb
  ├README.md
  ├kaki-utils-0.0.1.gem
  ├kaki-utils-0.0.10.gem
  ├kaki-utils-0.0.2.gem
  ├kaki-utils-0.0.3.gem
  ├kaki-utils-0.0.4.gem
  ├kaki-utils-0.0.5.gem
  ├kaki-utils-0.0.6.gem
  ├kaki-utils-0.0.7.gem
  ├kaki-utils-0.0.8.gem
  ├kaki-utils-0.0.9.gem
  ├kaki-utils-0.1.0.gem
  ├kaki-utils-0.1.1.gem
  ├kaki-utils-0.1.10.gem
  ├kaki-utils-0.1.11.gem
  ├kaki-utils-0.1.12.gem
  ├kaki-utils-0.1.13.gem
  ├kaki-utils-0.1.14.gem
  ├kaki-utils-0.1.15.gem
  ├kaki-utils-0.1.2.gem
  ├kaki-utils-0.1.3.gem
  ├kaki-utils-0.1.4.gem
  ├kaki-utils-0.1.5.gem
  ├kaki-utils-0.1.6.gem
  ├kaki-utils-0.1.7.gem
  ├kaki-utils-0.1.8.gem
  ├kaki-utils-0.1.9.gem
  └kaki-utils.gemspec

 

コード

元の Python コードはまったく見ていません。簡単な再帰で実装しています。
print_dir_tree.rb

class Dir
  def self.print_tree(top_dir = Dir.pwd)
    unless File.directory?(top_dir)
      raise %("#{top_dir}") + " is not directory."
    end
    puts "<#{File.basename(top_dir)}>"
    
    walk_dir = ->(dir, pre) {
      Dir.chdir(dir) rescue return
      d_f = Dir.glob("*").sort
      dirs = d_f.select {|df| File.directory?(df)}
      files = d_f - dirs
      end_num = d_f.size
      line_num = 1
      
      dirs.each do |d|
        s0 = (line_num == end_num) ? "" : ""
        line_num += 1
        puts pre + s0 + "<#{d}>"
        s1 = pre + ((s0 == "") ? "   " : "")
        walk_dir.(d, s1)
      end
      
      files.each do |f|
        s = (line_num == end_num) ? "" : ""
        line_num += 1
        puts pre + s + f
      end
      
      Dir.chdir("..")
    }
    walk_dir.(top_dir, "  ")
  end
end


if __FILE__ == $0
  Dir.print_tree("./kaki-utils/")
end