気づけば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";
}
}