PerlでJPEGのEXIFを取得してファイルを整理する

気づけば2月も半ばになり、新年とは言えない時期になってしまった。今年最初のネタはプログラマらしい話から。

僕はデジカメのファイルを溜め込みがち。ときどき意を決して、デジカメからファイルを全部パソコンに転送して、エクスプローラでEXIFをみながら、日付とイベントで名前をつけたフォルダを作ってその中に移動して整理する。

# 「溜め込むなよ」とか「もっとましなツール使え」とか言われそう

この間もSDカードが一杯になったので整理をしていて、ふと「この作業ってプログラム向きだね」と考えてしまった。

というわけで、久々の日曜プログラマ。

CPANを探せば、EXIFをとってくるようなものがきっとあるだろうと思って探すと、いくつかありそう。今回はImage-ExifToolを使うことにした。Windows環境なので、ActivePerlを使って実装。

僕のカメラ(Canon PowerShot G7)だと「CreateDate」という属性に撮影日が入ってたので、それを使うことにした。EXIFの取り決めとかはあんまり興味ないので調べなかった。許して。

JPEGファイルを並べたフォルダ内で実行すると「YYYY-MM-DD」というフォルダを作ってその中にファイルを移動するように実装してみた。

実行環境やカメラによってはうまく動かないかも。なのでAS-ISということで。うっかりファイルが消えたりしても責任とれません。

use strict;
use Image::ExifTool;
use File::Copy;
# ExifToolの用意
my $exif_tool = new Image::ExifTool;
my @file = glob('*.jpg');
for my $file (@file) {
# exif情報の取得
my $exif_info = $exif_tool->ImageInfo($file);
my $create_date = $exif_info->{'DateTimeOriginal'};
# 日付情報の切り出し
if ( $create_date =~ /(\d+):(\d+):(\d+)/ ) {
my $year  = $1;
my $month = $2;
my $day   = $3;
# ディレクトリの作成と移動
my $dir_name = "$year$month$day";
mkdir($dir_name);
move($file, $dir_name);
print "$file is moved.\n";
} else {
print "$file is NOT moved.\n";
}
}


2010/09/14 追記

以前のソースではEXIFのCreateDate属性を使っていたけど、これは機種に依存するようだ。携帯で撮影したファイルが振り分けられないので気がついた。

しかたなく、EXIFについて少しお勉強(詳しそうなサイトを見ただけなのだけど)。 こちらのサイトが大変勉強になった。

たぶんDateTimeOriginalという属性を使えばいいようだ。

実装を直してみると、これまでのカメラ(Canon PowerShot S40/G7)に加えて携帯カメラも振り分けができるようになった。
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です