モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

デジカメ画像ファイルとかを日付でフォルダに分けるスクリプト

うちではデジカメの画像を、フォルダに日付+その内容という名前をつけて、日付ごとに保存するようにしてるんですが、SDカードの容量増加もあって、すごいたくさんたまっちゃってから分類しようとするんで、片付けがとても億劫になってます。


中身見て名前付けるのはまだしも、日付ごとにフォルダ作ってそこにファイルを放り込む、という単純作業がうっとおしいので、そこを自動化するスクリプトを書きました。


Active Perl で動かしてますが、別に特別なことしてないので、漢字コード変換だけいじれば cygwinperlとかでも動くはず。


まず、ActivePerlをインストールします。

photoautomove.pl をダウンロードして適当なところへ。

#!/usr/bin/perl -w
use strict;
use encoding 'shiftjis';
use Encode;

my $srcdir = encode( 'shiftjis', "C:/Documents and Settings/USER_NAME/My Documents/My Pictures/日付整理対象" );
my $distdir = encode( 'shiftjis', "C:/Documents and Settings/USER_NAME/My Documents/My Pictures/日付整理後" );

checkmkdir( $distdir );
execdir( $srcdir );

exit;


#-----------------------------------------------------------------------

sub execdir #( src )
{
	my $src = shift;

	opendir DIR, $src;
	my @files = readdir DIR ;
	close DIR;

	my $filename;
	foreach $filename (@files) {
		my $file = encode( 'shiftjis', "$src/$filename" );
		if ( -d $file ) {
			# ディレクトリの場合再帰処理
			if ( ! ( $filename eq '.' || $filename eq '..' ) ) {
				#print "dir: $filename\n";
				execdir( $file );
			}
		}
		else {
			my @status = stat $file;

			my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime( $status[9] );
			$year += 1900;
			$mon ++;
			#print "$filename $year $mon $mday\n";

			my $mondir = sprintf( "%02d%02d", $year-2000, $mon );
			my $daydir = sprintf( "%02d%02d%02d", $year-2000, $mon, $mday );
			my $mdir = encode( 'shiftjis', "$distdir/$mondir" );
			my $ddir = encode( 'shiftjis', "$distdir/$mondir/$daydir" );

			# 保存先ディレクトリの存在確認して無かったら作る
			checkmkdir( $mdir );
			checkmkdir( $ddir );
			
			# 保存先ディレクトリにファイルを移動する
			my $distfile = encode( 'shiftjis', "$ddir/$filename" );
			print "mv $file $distfile\n";
			rename( $file, $distfile );
		}
	}
	
	return;
}

sub checkmkdir #( dir )
{
	my $dir = shift;

	if ( ! ( -d $dir ) ) {
		print "mkdir $dir\n";
		mkdir( $dir );
	}
}

あたまのほう、$srcdirと$distdirが整理対象フォルダと整理したものを置くフォルダなので、そのパスのうち、USER_NAMEとなってるところを自分のユーザ名に修正して、お好みで整理したい写真を置いておくパスや、整理した後の写真を置くパスを修正。
デフォルトでは「My Pictures」フォルダの中の「写真整理対象」の中を整理して「写真整理後」フォルダの中に放り込むようになっています。

「写真整理対象」に適当に整理したい写真やフォルダを突っ込んで、「写真整理」をダブルクリックして実行すると、「写真整理後」のフォルダに、「年月」と「年月日」でフォルダが作られてファイルが分類されます。


なんかいくらでも同じようなことしてくれるツールありそうな気もしますが、せっかく書いたから一応公開。