bookscanのチューニング後の本の名前を変更する

kindle4_本の名前.pdf という名前が並んでいると見づらいので、 kindle4/本の名前_kindle4.pdf にする。

#!/usr/bin/env ruby
dir = '/home/sho/share/books'
pattern = /^(ipad|kindle\d|iphone4)_(.+)\.(.+)$/

files = Dir.glob(dir+'/*/*.pdf').map{|f|
  { 
    :path => f,
    :name => f.split('/').last,
    :dir => File.dirname(f)
  }
}

files.delete_if{|f|
  !(f[:name] =~ pattern) or f[:path].split('/').include?('tmp')
}.each{|f|
  begin
    device, name, ext = f[:name].scan(pattern).first
    raise 'filepath parse error' unless ext
    new_dir = f[:dir]+'/'+device
    Dir.mkdir new_dir unless File.exists? new_dir
    puts f[:path]
    new_fpath = "#{f[:dir]}/#{device}/#{name}_#{device}.#{ext}"
    File.rename(f[:path], new_fpath)
    puts " => #{new_fpath}"
  rescue => e
    STDERR.puts e
  end
}