himitsu girlsの日記

 | 

2007-01-03

[]16章 練習問題(1)

Rubyが利用できるライブラリファイル名を表示するメソッド

def print_libraries
  $:.each {|path|
    next unless File.directory?(path)
    Dir.open(path) {|dir|
      dir.each {|name|
        puts name if name =~ /\.(rb|so)$/
      }
    }
  }
end
print_libraries

[]16章 練習問題(2)

コピー元のディレクトリ名のファイルディレクトリを、コピー元のディレクトリ名のディレクトリの下にコピーするメソッド

FileUtils.cp_r("../test", "../test2")

これで一発っぽいので略。

[]16章 練習問題(3)

Unixコマンドのdu

def du(dir)
  size = 0

  Dir.open(dir) {|d|
    d.each {|name|
      path = File.join(dir, name)
      if File.directory?(path)
        next if name == "." or name == ".."
        size += du(path)
      else
        st = File.lstat(path)
        size += st.size
        printf("%6d %s\n", st.size, path)
      end
    }
  }
  printf("%6d %s\n", size, dir)
  return size
end
du(".")

du -ab相当。解答例は同じ再帰なのにシンプルだなぁ。再帰は苦手だ。

トラックバック - http://rubyist.g.hatena.ne.jp/himitsu_girls/20070103
 |