この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
KBMJがZDnetで連載している記事を紹介します。コメントなどありましたらそちらでお願いします。
Rubyでどう書く?特別編:Matzからのお題 高倉利明(KBMJ)
まつもとゆきひろ氏と食事をした時に頂いたお題にKBMJの高倉利明氏が答える。テーマは「Rubyでメモリカード上の写真を指定フォルダに振り分ける」だ。
問題
第6回のテーマは「Rubyでメモリカード上の写真を指定フォルダに振り分ける」です。
デジカメで撮りためたデータをPCにバックアップする際、大量の撮影データの振り分けが面倒です。
そこで今回はRubyスクリプトを使用してファイルを自動的に振り分けてみることにしました。
仕様
格納元フォルダ以下から画像データを抽出し、格納先フォルダに日付「yymmdd」ごとに振り分ける画像データかどうかは拡張子「jpg, JPG, jpeg, JPEG」で判定日付はEXIFの「MetadataDate」の日付を利用
回答例
require ‘parsedate’
require ‘fileutils’
require ‘find’
require ‘rubygems’
require ‘extexif’
# フォルダ指定
src = “/mnt/card/DCIM/100NECDT/”
dst = “/var/image/”
# ファイルリスト作成
list = []
Find.find(File.expand_path(src)) { |path|
if /.*(jpg|JPG|jpeg|JPG)\z/ =~ path
list << path
end
}
# 振り分け
list.sort.each { |path|
image = ExtExif.new(path)
foldername = image[“MetadataDate”][0,10].split(/:/).join
folderpath = dst + foldername
Dir.mkdir(folderpath) unless File.exist?(folderpath)
FileUtils.cp(path, folderpath)
}
解説
本処理は以下の流れで行っています。
- 対象フォルダ内から再帰的にファイルを検索してパスのリストを作成
- 各ファイルのEXIFデータから日付取得
- 日付のフォルダを作成
- 日付フォルダにファイルコピー
今回はEXIFフォーマット取得のためにExtEXIFライブラリを使用しました。
最後に
今回は簡略化のため以下の処理を省いてあります。
- 画像ファイルのバイナリファイル形式確認
- EXIFから取り出した日付フォーマット確認
実用に利するためには、このような点に注意すると良いと思います。
なお、今回のお題はbuilder編集部の昼食会で、Matzにお会いしたときにもらったお題です。ご協力ありがとうございました!