Rubyでどう書く?特別編:Matzからのお題
高倉利明(KBMJ)
2008/08/06 20:59
まつもとゆきひろ氏と食事をした時に頂いたお題に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にお会いしたときにもらったお題です。ご協力ありがとうございました!
- 特集: Rubyでどう書く? (7件)
- ホワイトペーパー
- 話題のタグ
アプリケーション
ソフトウェア開発
Internet Explorer
Firefox
PHP
JavaScript
Windows
データベース
Ajax
モバイル
プログラミング言語
Google
Webデザイン
Firefox 3
Microsoft
Linux
Chrome
HTML
iPhone
iPod touch
脆弱性
Database
開発環境
Opera
UI
Windows XP
Flash
Windows Vista
Mozilla
インストール
Off Topic
Webサービス
リファレンス
Windows 7
仮想化
Apple
Java
WebKit
RIA
セキュリティ
Mac OS X
Tips
ブラウザ
マイクロソフト
オープンソース
Safari
小技
iPhone 3G
OS
CSS
話題のタグを見る »
グーグル、JavaScriptプログラミングツールをリリース
Windowsの歴史 Windows Server 2008編:同じカーネルを持つ「Vista」とは対照的に早くから支持を得たサーバOS
Windowsの歴史 Windows Server 2003 R2編:安定性と先進性の両立目指す「R2」の先駆けとなったOS
モジラ、「Firefox 3.6」の第1ベータ版をリリース
進むストレージ環境の見直し
企業ITシステムの企画、構築、運用のイロハ
最大32個のセンサーが電力を徹底管理!
【最終警告】パンデミック対策特集
大丈夫?あなたの会社のセキュリティ対策
―エン・ジャパン厳選求人☆毎週更新―
100万円で実現!中小企業の情報漏えい対策