exifrを使ってデジカメの画像をリネーム

JPEGファイルのEXIF情報を取得するライブラリ「exifr」を使って,デジカメ画像のファイル名をリネームするスクリプトを書いてみました。
まずはexifrのインストール

> gem install exifr

スクリプト

#!ruby -Ks
$KCODE='s'
require 'exifr'

# Timeから新しいファイル名(拡張子除く)を生成
def file_spec(tm)
  '%04d%02d%02d_%02d%02d%02d' % tm.to_a[0,6].reverse
end

# 重複しないファイル名を生成
def no_overlaps(path)
  tmp = path
  d = File.dirname(tmp)
  ext = File.extname(tmp)
  fs = File.basename(tmp, ext)
  i = 2
  while File.exist?(tmp)
    tmp = File.join(d, "#{fs}_#{i}#{ext}")
    i += 1
  end
  tmp
end

# 新しいファイル名を生成
def new_file_name(old_path, tm)
  new_spec = file_spec(tm)
  new_name = new_spec + File.extname(old_path)
  new_path = File.join(FilePath, new_name)
  no_overlaps(new_path)
end

# ファイル名を変更
def ren_exec(path)
  tm = case File.extname(path)
    when /\.jpe?g/i
      # JPEGの場合はEXIFの日時
      tags = EXIFR::JPEG.new(path)
      tags.exif[:date_time]
    when /\.avi/i
      # AVIの場合はファイルの更新日時
      File.mtime(path)
  end
  new_path = new_file_name(path, tm)
  puts "#{File.basename(new_path)} <- #{File.basename(path)}"
  File.rename path, new_path
end

# 実行
FilePath = File.expand_path(ARGV[0] || '.')
pattern = "%s/*.jpg\0%s/*.jpeg\0%s/*.avi" % [FilePath, FilePath, FilePath]

Dir.glob(pattern) do |path|
  ren_exec path
end

実行

> ruby rename.rb C:\tmp
  • 指定したディレクトリ(指定がなければカレントディレクトリ)の直下のファイルが対象となります。
  • JPEGだけでなく,AVIファイルも同時にリネームします。
    • AVIファイルについては,ファイルの更新日時を元にリネームを行います。