ディレクトリ内ファイルの再帰処理を高速に済ませたい

ホントの天才は世の中に二人いて、ひとりはアラン・チューリング。もうひとりは守安祥太郎だと声を大にしていいたい今日この頃、皆さんいかがお過ごしですか?

どっちかってーとrubyはwebアプリを書くため的な風潮の中、わたすは業務で使っておりますよ。ディレクトリ内のファイルを文字列加工して次工程に渡すのがわたすの仕事の40%を占めておりまして、このメンドーなことを高速で済ませ休憩所でいち早く至福の時間を求めるためにこんなの書いてみた。

require 'pathname'

class Recur
  
  def initialize(dir)
    @path = Pathname.new(dir)
    @new_dir = @path.realpath + "done"
  end
  
  def write_to_one
    @path.find do |f|
      yield(f.read) if f.file?
    end
  end
  
  def write_to_each
    
    if @new_dir.exist?
      puts "'done' directory exists, which overwrites."
    else
      @new_dir.mkdir(0777)
      puts "create new 'done' directory."
    end
    
    @path.find do |f|
      if f.file?
        newfile = @new_dir + f.basename
        yield(newfile.to_s, f.read)
      end
    end
    
  end
  
end

こんなかんじで高速に再帰処理。

require 'recur'

dir = Recur.new('test')
dir.write_to_each do |fn, str|
  open(fn, "wb") do |itm|
    itm.puts str
  end
end

strで渡ってきたファイルごとの文字列をそのまま置換したり、eachで行ごとの処理をしたり。あとはオペレータさんとの相談ってことで。

ホントはこんなふうにしたかった。

require 'pathname'

class Recur
  
  def initialize(dir)
    @path = Pathname.new(dir)
    @new_dir = @path.realpath + "done"
  end
  
  def write_to_each
    
    if @new_dir.exist?
      puts "'done' directory exists, which overwrites."
    else
      @new_dir.mkdir(0777)
      puts "create new 'done' directory."
    end
    
    @path.find do |f|
      if f.file?
        newfile = @new_dir + f.basename
        open(newfile.to_s, "wb") do |nf|
          yield(nk, f.read)
        end
      end
    end
    
  end
  
end

とか書いて

dir = Recur.new('test')
dir.write_to_each do |fn, str|
  fn.print str
end

しかしこういうふうに書くと、ファイルは生成されてstrも持って来れるのにファイルに書くことができない。「fn.print "gagagaga"」とかしたらそれぞれのファイルに「gagagaga」は書かれるんだけど。なんでだろう?