読者です 読者をやめる 読者になる 読者になる

NeverBlog::Likk::Unexistable;

見なかったことにして下さい

ファイル名を撮影日((厳密な意味で、必ずしも撮影日じゃない。))に

参考 リネームスクリプト - あじゃぱー

たしかにファイル名がPIC001な感じなので、直したくて借りたんだけど、
ちっと保存ファイル名形式を自分なりに変更しようと思ってごにょごにょしてたら、何か全然変わってしまった。ほぼ全車輪。

撮影日の取得にstatのファイル最終変更日付を使用。
撮影した後、携帯のソフトやPCに移した後でデータを加工しなければ大丈夫*1

最終変更日じゃなくて、きちんと撮影日を取得するならImage::MetaData::JPEGとか必要らしいが、モジュールをインスコするのが面倒だったので、最終変更日で妥協*2

ファイル名形式をYYYYMMDD24himiに
同じ時刻のが既にあれば、YYYYMMDD24himi_1,YYYYMMDD24himi_2みたいに*3

use strict;
package main;
local $\ = "\n";

#コマンドライン応答------------------------------
print "change list";
main (0);#一回目は変更内容の表示だけ。
my $input ="";
while(1){
	print "change? [y/n]";
	$input = <STDIN>;
	$input =~ s/(\r|\n)//g;
	last if ($input eq 'y' or $input eq 'n');
}
if($input eq 'y'){
	main (1);#2回目。yなら実際に変更。
	print "changed";
}else{
	print "no change";
}
sleep 2;
exit(0);


#実処理----------------------------------------
sub main{
	my $num = shift;
	my @pictures = <*.jpg>;
	my @changed = @pictures;
	for my $pict (@pictures){
		
		next if( $pict =~ /^[0-9]{12}/);
	
		my @stats = stat $pict;
		my $upd_date = $stats[9];
		my @t = localtime($upd_date);
		my $yyyymmdd24hmi = sprintf("%04d%02d%02d%02d%02d", $t[5] + 1900, $t[4]+1, $t[3], $t[2], $t[1]);
		
		my $cnt = 0;
		my $tail ="";
		while(1){
				$tail = "_".$cnt if $cnt != 0; 
			if (str_eq(\@changed,$yyyymmdd24hmi.$tail)){
				$cnt++;
			}else{
				push @changed ,$yyyymmdd24hmi.$tail;
				if($num ==1){
					rename $pict,$yyyymmdd24hmi.$tail.".jpg";
				}else{
					print $pict."	=> ".$yyyymmdd24hmi.$tail.".jpg";
				}
				last;
			}
		}
	}
}

#by Perl6::Junction any--------------------------
sub str_eq {
	my ($self, $test) = @_;
	for (@$self) {
		return 1 if $_ eq $test;
	}
	return;
}

適当なファイル名で、スクリプトを保存して、画像フォルダにスクリプトをコピーしてWクリック。
一回変更内容を表示した上で、問題なければ[y]で変更、[n]でキャンセル。

*1:ファイルの移動だけなら最終変更日付は変わらない

*2:どうせ撮りっぱなしだし

*3:1,2などの連番が必ずしも撮影順じゃない…orz