Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Rubyで日付形式のファイル名をインクリメントして新規ファイルを作成

概要

日付形式のファイル名をインクリメントして新規ファイルを作成

詳細

任意のフォルダ内にある「YYYYMMDD_ファイル名.txt」という
命名ルールのファイルを最大の日付+1日で新規追加する。

サンプルコード

# encoding: Windows-31J

require "date"
require "pp"

class File
  # ファイル名、桁数、拡張子を引数に指定
  def File.get_next_date_file_name(base_filename)
    dates = []
    # 指定した形式のファイルリストを取得
    Dir.glob( base_filename ) do |file|
      # 指定した形式のファイルリストを取得
      date = Date::new(file.slice(0, 4).to_i, file.slice(4, 2).to_i, file.slice(6, 2).to_i)
      dates << date
    end
    
    if (dates.size == 0)
      # 1ファイルも存在しない場合は、カレント日付で1ファイル目を作成
      dates << Date.today 
      last_date_file = nil
      next_date_file = dates[0].strftime("%Y%m%d") + base_filename.sub("*","")
    else
      dates.reverse!
      last_date = dates[0]
      last_date_file = dates[0].strftime("%Y%m%d") + base_filename.sub("*","")
      next_date_file = last_date.succ.strftime("%Y%m%d") + base_filename.sub("*","")
    end
    
    file_set = [last_date_file, next_date_file]
    return file_set
  end
end

def copy_file(from_file ,to_file)
  if (from_file)
    open(from_file) do |input|
      open(to_file, "w") do |output|
        output.write(input.read)
      end
    end
  else
    open(to_file, "w")
  end
end

file_set =  File.get_next_date_file_name("*_daily\.txt")
copy_file(file_set[0], file_set[1])

出力

1回目実行(カレント日付のファイルが作成される)

$ls | grep _daily
20121122_daily.txt

2,3,4回目実行(インクリメントの確認)

$ls | grep _daily
20121122_daily.txt
20121123_daily.txt
20121124_daily.txt
20121125_daily.txt