Rubyでどう書く?特別編:Matzからのお題

高倉利明(KBMJ)
2008-08-06 20:59:01
  • このエントリーをはてなブックマークに追加

問題

まつもとゆきひろ氏 まつもとゆきひろ氏

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

解説

 本処理は以下の流れで行っています。

  1. 対象フォルダ内から再帰的にファイルを検索してパスのリストを作成
  2. 各ファイルのEXIFデータから日付取得
  3. 日付のフォルダを作成
  4. 日付フォルダにファイルコピー

 今回はEXIFフォーマット取得のためにExtEXIFライブラリを使用しました。

最後に

 今回は簡略化のため以下の処理を省いてあります。

  • 画像ファイルのバイナリファイル形式確認
  • EXIFから取り出した日付フォーマット確認

 実用に利するためには、このような点に注意すると良いと思います。

 なお、今回のお題はbuilder編集部の昼食会で、Matzにお会いしたときにもらったお題です。ご協力ありがとうございました!

  • 新着記事
  • 特集
  • ブログ