#!/usr/bin/env ruby cams = { "SIGMA DP2 Merrill" => "dp2m", "FP2" => "fp2", "Canon EOS 1000D" => "1000d", "iPad Air" => "ipadair", "iPhone 5" => "iphone5" } cams.default = "default" file_ext = ARGV[0] if !file_ext file_ext = "jpg" end ids = [] while line = STDIN.gets # list of files a = line.split('.') a.pop ids << a.join('.') end used_prefixes = {} # prefix -> 0..N ids.each do |i| exif = `exiftool #{i}.#{file_ext} 2>/dev/null` a = exif.split "\n" timestamp = nil timestamp_bak = nil cam = nil cam_bak = nil a.each { |j| if j.start_with? "Camera Model Name" cam = j elsif j.start_with? "Model" cam_bak = j elsif j.start_with? "Date/Time Original" timestamp = j elsif j.start_with? "File Modification Date/Time" timestamp_bak = j else next end } skip = false t = "" c = "" new_prefix = "" add = 0 begin if timestamp t = timestamp.split(':',2)[1].strip.gsub(/(:|\ )/, '-') elsif timestamp_bak t = timestamp_bak.split(':',2)[1].strip.gsub(/(:|\ )/, '-') end if cam c = cams[cam.split(':',2)[1].strip] elsif cam_bak c = cams[cam_bak.split(':',2)[1].strip] else c = "unknown-device" end new_prefix = "#{t}-#{c}" add = 1 rescue puts "Can't find metadata for #{i}, skipping!" skip = true end if t.split('-').first.to_i < 2000 puts "metadata unreasonable for #{i}, skipping!" skip = true end next if skip while used_prefixes.has_key? new_prefix new_prefix = "#{t}-#{add}-#{c}" add += 1 end used_prefixes[new_prefix] = true Dir.glob("#{i}*").each { |f| ext = f.gsub(/^#{i}/,"") if File.exists? "#{new_prefix}#{ext}" puts "File exists: #{new_prefix}#{ext} (#{i})!" exit else `mv #{i}#{ext} #{new_prefix}#{ext}` end } end