複数のデジカメの写真をフォルダに突っ込んでる。するとファイル名がかぶる。かといってIMG00001(2).jpg も美しくない。
そこでどうするか。写真の撮影日時をファイル名に採用することにする。
EXIFを使ってファイルを、名前を統一する。
RubyでExifを読み込む mini_exiftoolを利用した。
#!/usr/bin/env ruby require 'rubygems' require 'mini_exiftool' require 'pp' Dir.glob('*.jpg').each{|e| exif = MiniExiftool.new(e).to_hash d = File.mtime unless exif.has_key?('DateTimeOriginal') d = exif.fetch('DateTimeOriginal') if exif.has_key?('DateTimeOriginal') to_name = d.strftime('IMG_%Y%m%d_%H%M%S.jpg') src_name = e next if src_name == to_name File.rename e, to_name }
2012-05-03追記
コマンド引数からファイルパスを受け取るようにした。また同じ時刻に撮った写真が2枚あると上書きしていたのを修正した
#!/usr/bin/env ruby require 'rubygems' require 'mini_exiftool' require 'pp' if ARGV.size < 1 then puts "Usage: ./#{__FILE__} dirname\n " exit; end ARGV.select{|e| File.exists? e and File.directory? e }.map{|d_name| #末尾のスラッシュを省く #相対パスは絶対パスに File.expand_path( File.basename(d_name),File.dirname(d_name)) }.each{|dirname| Dir.glob("#{dirname}/*.jpg").each{|e| ##Dir.glob('*.jpg').each{|e| exif = MiniExiftool.new(e).to_hash d = File.mtime e unless exif.has_key?('DateTimeOriginal') d = exif.fetch('DateTimeOriginal') if exif.has_key?('DateTimeOriginal') #puts "#{e} is #{d.strftime('%Y-%m-%d %H:%M:%S')}" to_name = "#{dirname}/#{d.strftime('IMG_%Y%m%d_%H%M%S.jpg')}" src_name = e next if src_name == to_name if File.exists? to_name then i=1 tmp_name = to_name while File.exists? tmp_name do tmp_name = "#{File.dirname(to_name)}/#{File.basename(to_name,'.jpg')}-#{i}.jpg" i = i+ 1 end to_name = tmp_name end puts to_name File.rename e, to_name } }