拡張子ごとのファイルリスト

30分プログラム、その84。
拡張子ごとにファイル数を数えるプログラム。そこはかとなく、パイプでlsとかを繋げばできる気がしてる。

ファイルを整理するごとに、拡張子だけを取り出して確認したがったので。

$ ruby -w ext.rb *
*       :[=================      ] (bible,cat,db,dict,...)
*.awk   :[==                     ] (ls.awk,rawk.awk)
*.bmp   :[=                      ] (ChiPet.bmp)
*.css   :[=                      ] (flist.css)
*.dat   :[=                      ] (hiki_fortune.dat)
*.db    :[=                      ] (foo.db)
*.hs    :[==========             ] (coin.hs,lisp.hs,n-gram.hs,part_sum.hs,...)
*.html  :[=                      ] (flist.html)
*.ico   :[=                      ] (favicon.ico)
*.ml    :[==                     ] (lisp.ml,s_exp.ml)
*.pdf   :[=                      ] (ruby.pdf)
*.pl    :[=================      ] (3n1.pl,busybox.pl,cgi.pl,croquis_list.pl,...)
*.png   :[=                      ] (hatena.png)
*.py    :[=====================  ] (RSS.py,basename.py,color.py,colorgrep.py,...)
*.rb    :[=======================] (amb.rb,bezier.rb,blur.rb,designp.rb,...)
*.scm   :[===============        ] (args.scm,clean.scm,clist.scm,coin.scm,...)
*.sed   :[=                      ] (hw.sed)
*.sh    :[=                      ] (self.sh)
*.txt   :[======                 ] (3n1.txt,gpl.txt,input.txt,keitai_sample.txt,...)
*.xml   :[=                      ] (musiclist.xml)
#!/opt/local/bin/ruby -w

extensions = Hash.new{|hash,key| hash[key] = [] }

ARGV.each{|filename|
  ext = File.extname(filename)
  if extensions.key? ext then
  extensions[ext] << filename
  else
    extensions[ext] = [filename]
  end
}

max = extensions.map{|_,files| files.size }.max

extensions.keys.sort.each{|ext|
  files = extensions[ext].sort
  files_list = files.size > 3 ? files[0..3].join(',')+',...' : files.join(',')

  size = files.size
  bar = ('=' * size) + (' ' * (max - size))
  puts "*#{ext}\t:[#{bar}] (#{files_list})"
}
  • map+maxは、1.9ならmax_byでいけるんだろうな
  • タブによる位置合せよりも、もっと賢い方法が欲しいな
  • さっそく_を使っていみた。いいね