それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

デジカメの写真の連番がおかしくなったので、撮影日時をファイル名にする。

複数のデジカメの写真をフォルダに突っ込んでる。するとファイル名がかぶる。かといってIMG00001(2).jpg も美しくない。
そこでどうするか。写真の撮影日時をファイル名に採用することにする。

EXIFを使ってファイルを、名前を統一する。

RubyExifを読み込む 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
}

mini_exiftoolが必要

これはRubyExifを読み込む mini_exiftoolを使っている。

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
	}
}