Coding for Fun

ruby on railsを中心としたウェブ技術つれづれ日記

Rubyで大きなファイルを編集する

あるフォルダ以下のファイルに関して、正規表現とか使って内容を少し変更したいことがあります。
そういうときの方法についてメモ。

Dir.glob("./path-to-folder/**/*.rb") do |file|
  Tempfile.open('foo') do |tf|
    IO.foreach(file) do |line|
      line = line.gsub(...)
      tf.write line
    end

    tf.close
    FileUtils.copy_file tf.path, file
  end
end

Rubyは実に美しい。

ポイント
  • Dir.globを使うと、特定のフォルダ以下のファイルを検索できる。**を使うと、サブフォルダ以下を再帰的に探していく。
  • IO.foreachを使うと、行ごとに編集できるから、メモリに収まらないような巨大なファイルでも編集できる。
  • とりあえず一時ファイルに保存して、その後上書きすればよい。直接ファイルを編集することはできないらしい(参考)