version 0.4
@@ -11,6 +11,7 @@ | ||
11 | 11 | # renfile_exif_date.pl |
12 | 12 | # version 0.2 (2010/December/06) |
13 | 13 | # version 0.3 (2011/January/04) |
14 | +# version 0.4 (2011/January/05) | |
14 | 15 | # |
15 | 16 | # GNU GPL Free Software |
16 | 17 | # |
@@ -41,8 +42,12 @@ | ||
41 | 42 | use strict; |
42 | 43 | use warnings; |
43 | 44 | use utf8; |
45 | + | |
46 | +my $flag_os = 'linux'; # linux/windows | |
47 | +my $flag_charcode = 'utf8'; # utf8/shiftjis | |
48 | + | |
44 | 49 | use POSIX; |
45 | -use Gtk2 qw/-init/; | |
50 | +use Gtk2 qw/-init/; # Windowsの場合は、この行をコメントアウト | |
46 | 51 | use Image::ExifTool; |
47 | 52 | use File::Basename; |
48 | 53 | use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/; # 必要ないエンコードは削除すること |
@@ -51,8 +56,17 @@ | ||
51 | 56 | #use Data::HexDump; |
52 | 57 | |
53 | 58 | |
54 | -binmode( STDOUT, ":utf8" ); # "Wide character in print at ..." 警告を抑止 | |
55 | -#binmode(STDOUT, "encoding(sjis)"); # Windowsのコマンドラインではsjisになる | |
59 | +#binmode( STDOUT, ":utf8" ); # "Wide character in print at ..." 警告を抑止 | |
60 | +if($flag_charcode eq 'utf8'){ | |
61 | + binmode(STDIN, ":utf8"); | |
62 | + binmode(STDOUT, ":utf8"); | |
63 | + binmode(STDERR, ":utf8"); | |
64 | +} | |
65 | +if($flag_charcode eq 'shiftjis'){ | |
66 | + binmode(STDIN, "encoding(sjis)"); # Windowsのコマンドラインではsjisになる | |
67 | + binmode(STDOUT, "encoding(sjis)"); # Windowsのコマンドラインではsjisになる | |
68 | + binmode(STDERR, "encoding(sjis)"); # Windowsのコマンドラインではsjisになる | |
69 | +} | |
56 | 70 | |
57 | 71 | my $strTargetDir = $ENV{'HOME'}; # 対象ディレクトリ |
58 | 72 | my $flag_date_type = 'YYYY-mm-DD'; # 日時形式 |
@@ -59,10 +73,20 @@ | ||
59 | 73 | my $flag_change_lowercase = 1; # ファイル名を小文字に変換する |
60 | 74 | |
61 | 75 | my @arrImageFiles = (); # 画像ファイルを格納する配列 |
62 | -my @arrFileScanMask = ('*.jpg', '*.jpeg', '*.JPG', '*.JPEG'); # 処理対象 | |
63 | - # Windowsの場合は、大文字の .JPG .JPEG の記述不要 | |
64 | 76 | |
77 | +my @arrFileScanMask = undef; | |
78 | +if($flag_os eq 'linux'){ | |
79 | + @arrFileScanMask = ('*.jpg', '*.jpeg', '*.JPG', '*.JPEG'); # 処理対象 | |
80 | +} | |
81 | +if($flag_os eq 'windows'){ | |
82 | + @arrFileScanMask = ('*.jpg', '*.jpeg'); # 処理対象 | |
83 | + # Windowsの場合は、大文字の .JPG .JPEG の記述不要 | |
84 | +} | |
85 | +my @arrKnownExt = ('.jpg', '.jpeg', '.JPG', '.JPEG'); | |
86 | + | |
65 | 87 | my $flag_gui = 0; |
88 | +my $flag_fname_style = 'date-base'; # date-base, base-date, date : ファイル名決定で日時と元ファイル名の利用方法 | |
89 | +my $flag_undo_mode = 0; # 0:OFF, 1:ON | |
66 | 90 | my $flag_verbose = 1; |
67 | 91 | |
68 | 92 | my $return_code = undef; |
@@ -69,7 +93,10 @@ | ||
69 | 93 | |
70 | 94 | # GUIスイッチを引数に起動されたとき(Gtk2でのユーザインターフェース対応) |
71 | 95 | if(defined($ARGV[0]) && !(lc($ARGV[0]) cmp '-gui')){ $flag_gui = 1; } |
72 | -else{ print("\n".basename($0)." - ファイル名にExifより日時を付加するスクリプト\nGUI版は -gui スイッチで起動できます\n\n"); } | |
96 | +else{ | |
97 | + print("\n".basename($0)." - ファイル名にExifより日時を付加するスクリプト\n". | |
98 | + "GUI版は -gui スイッチで起動できます\n\n"); | |
99 | +} | |
73 | 100 | |
74 | 101 | # ディクトリ、日時形式の入力 |
75 | 102 | if($flag_gui == 1){ $return_code = sub_user_input_init_gui(); } |
@@ -78,6 +105,7 @@ | ||
78 | 105 | |
79 | 106 | # 対象ファイル一覧を @arrImageFiles 配列に格納する |
80 | 107 | sub_scan_imagefiles(); |
108 | +sub_sort_imagefiles(); | |
81 | 109 | |
82 | 110 | # 対象ファイル一覧を表示して、ファイル名変更を実行するかどうかユーザ選択させる |
83 | 111 | my $strPreview = sub_rename_main('preview'); |
@@ -84,7 +112,8 @@ | ||
84 | 112 | |
85 | 113 | if($flag_gui == 1){ |
86 | 114 | if(length($strPreview) > 0){ |
87 | - if(sub_display_message($strPreview, "処理内容のプレビュー", "ファイル名変更処理をしますか?", "処理開始", "中止") == 0){ exit(); } | |
115 | + if(sub_display_message($strPreview, "処理内容のプレビュー", "ファイル名変更処理をしますか?", | |
116 | + "処理開始", "中止") == 0){ exit(); } | |
88 | 117 | } |
89 | 118 | else { |
90 | 119 | sub_display_message("", "指定されたフォルダには jpeg ファイルが見つかりませんでした", "", "", "終了"); |
@@ -97,7 +126,7 @@ | ||
97 | 126 | printf("ファイル名変更処理をしますか? (Y/N) [N] : "); |
98 | 127 | $_ = <STDIN>; |
99 | 128 | chomp($_); |
100 | - if(length($_)<=0 || uc($_) ne 'Y'){ die("キャンセルしました\n"); } | |
129 | + if(length($_)<=0 || uc($_) ne 'Y'){ die("User Cansel(キャンセルしました)\n"); } | |
101 | 130 | } |
102 | 131 | else { |
103 | 132 | die("対象となるファイルが見つからないため終了します\n"); |
@@ -171,10 +200,23 @@ | ||
171 | 200 | $combobox_datetype->append_text('年月日(YYYY-mm-DD-)'); |
172 | 201 | $combobox_datetype->append_text('年月日時分(YY-mm-DD-HHMM)'); |
173 | 202 | $combobox_datetype->append_text('年月日時分(YYYY-mm-DD-HHMM)'); |
174 | - $combobox_datetype->set_active(5); | |
203 | + $combobox_datetype->set_active(0); | |
175 | 204 | $hbox_datetype->add($combobox_datetype); |
176 | 205 | |
206 | + # ファイル名形式(コンボボックス) | |
207 | + my $hbox_filenametype = Gtk2::HBox->new(); | |
208 | + $vbox->add($hbox_filenametype); | |
177 | 209 | |
210 | + my $label_filenametype = Gtk2::Label->new("ファイル名形式"); | |
211 | + $hbox_filenametype->add($label_filenametype); | |
212 | + | |
213 | + my $combobox_filenametype = Gtk2::ComboBox->new_text(); | |
214 | + $combobox_filenametype->append_text('日時-元ファイル名(YMD-basename.jpg)'); | |
215 | + $combobox_filenametype->append_text('元ファイル名-日時(basename-YMD.jpg)'); | |
216 | + $combobox_filenametype->append_text('日時(YMD.jpg)'); | |
217 | + $combobox_filenametype->set_active(0); | |
218 | + $hbox_filenametype->add($combobox_filenametype); | |
219 | + | |
178 | 220 | # ファイル名の小文字変換(チェックボックス) |
179 | 221 | my $hbox_lc = Gtk2::HBox->new(); |
180 | 222 | $vbox->add($hbox_lc); |
@@ -183,7 +225,15 @@ | ||
183 | 225 | if($flag_change_lowercase == 1){ $check_lc->set_active(1); } |
184 | 226 | $hbox_lc->add($check_lc); |
185 | 227 | |
228 | + # Undoモード(チェックボックス) | |
229 | + my $hbox_undo = Gtk2::HBox->new(); | |
230 | + $vbox->add($hbox_undo); | |
186 | 231 | |
232 | + my $check_undo = Gtk2::CheckButton->new_with_label("Undoモード(ファイル名を元に戻す)"); | |
233 | + if($flag_undo_mode == 1){ $check_undo->set_active(1); } | |
234 | + $hbox_undo->add($check_undo); | |
235 | + | |
236 | + | |
187 | 237 | # 実行・閉じるボタン |
188 | 238 | my $hbox_buttons = Gtk2::HBox->new(); |
189 | 239 | $vbox->add($hbox_buttons); |
@@ -193,7 +243,7 @@ | ||
193 | 243 | # 実行ボタンが押されたときのコールバック関数 |
194 | 244 | $strTargetDir = $entry_dir->get_text(); |
195 | 245 | if(substr($strTargetDir,-1) ne '/'){ $strTargetDir .= '/'; } # ディレクトリは / で終わるように修正 |
196 | -# $strTargetDir = Encode::encode('utf8', $strTargetDir); # Perl内部エンコードからUTF-8に変換し、かつ「UTF-8フラグを取る」 | |
246 | + | |
197 | 247 | my $nSelected = $combobox_datetype->get_active(); |
198 | 248 | if($nSelected == 0){ $flag_date_type = 'YYmmDD'; } |
199 | 249 | elsif($nSelected == 1){ $flag_date_type = 'YYYYmmDD'; } |
@@ -203,8 +253,18 @@ | ||
203 | 253 | elsif($nSelected == 5){ $flag_date_type = 'YYYY-mm-DD'; } |
204 | 254 | elsif($nSelected == 6){ $flag_date_type = 'YY-mm-DD-HHMM'; } |
205 | 255 | elsif($nSelected == 7){ $flag_date_type = 'YYYY-mm-DD-HHMM'; } |
256 | + | |
257 | + $nSelected = $combobox_filenametype->get_active(); | |
258 | + if($nSelected == 0){ $flag_fname_style = 'date-base'; } | |
259 | + elsif($nSelected == 1){ $flag_fname_style = 'base-date'; } | |
260 | + elsif($nSelected == 2){ $flag_fname_style = 'date'; } | |
261 | + | |
206 | 262 | if($check_lc->get_active() == 1){ $flag_change_lowercase = 1; } |
207 | 263 | else{ $flag_change_lowercase = 0; } |
264 | + | |
265 | + if($check_undo->get_active() == 1){ $flag_undo_mode = 1; } | |
266 | + else{ $flag_undo_mode = 0; } | |
267 | + | |
208 | 268 | $nReturn = 1; |
209 | 269 | Gtk2->main_quit(); # ウインドウのメインループを終了する |
210 | 270 | }); |
@@ -358,7 +418,7 @@ | ||
358 | 418 | else{ die("終了(理由:ディレクトリが入力されませんでした)\n"); } |
359 | 419 | } |
360 | 420 | if(substr($_,-1) ne '/'){ $_ .= '/'; } # ディレクトリは / で終わるように修正 |
361 | - unless(-d $_){ die("終了(理由:ディレクトリ ".$_." が存在しません)\n"); } | |
421 | + unless(-d sub_conv_to_local_charset($_)){ die("終了(理由:ディレクトリ ".$_." が存在しません)\n"); } | |
362 | 422 | unless($_ =~ m/^\// || $_ =~ m/^\.\//){ $strTargetDir = "./".$_; } |
363 | 423 | else{ $strTargetDir = $_; } |
364 | 424 | $strTargetDir = sub_conv_to_flagged_utf8($strTargetDir); |
@@ -365,23 +425,54 @@ | ||
365 | 425 | print("対象ディレクトリ : " . $strTargetDir . "\n\n"); |
366 | 426 | |
367 | 427 | |
368 | - print("日時形式の選択\n1.YYmmDD\n2.YYYYmmDD\n3.YYmmDDHHMM\n4.YYYYmmDDHHMM\n". | |
369 | - "5.YY-mm-DD\n6.YYYY-mm-DD\n7.YY-mm-DD-HHMM\n8.YYYY-mm-DD-HHMM\n(1〜8) [1] : "); | |
428 | + printf("元のファイル名に復元するUndoモードで実行しますか? (Y/N) [N] : "); | |
370 | 429 | $_ = <STDIN>; |
371 | 430 | chomp; |
431 | + if(length($_)<=0 || uc($_) eq 'N'){ | |
432 | + $flag_undo_mode = 0; | |
433 | + print("Undoモード : OFF(通常のExifリネームを行います)\n\n"); | |
434 | + } | |
435 | + else { | |
436 | + $flag_undo_mode = 1; | |
437 | + print("Undoモード : ON(元のファイル名に復元します)\n\n"); | |
438 | + } | |
439 | + | |
440 | + | |
441 | + if($flag_undo_mode == 0){ | |
442 | + print("日時形式の選択\n1.YYmmDD\n2.YYYYmmDD\n3.YYmmDDHHMM\n4.YYYYmmDDHHMM\n". | |
443 | + "5.YY-mm-DD\n6.YYYY-mm-DD\n7.YY-mm-DD-HHMM\n8.YYYY-mm-DD-HHMM\n(1-8) [1] : "); | |
444 | + $_ = <STDIN>; | |
445 | + chomp; | |
446 | + if(length($_)<=0){ $_ = 1; } | |
447 | + if(int($_)<1 || int($_)>8){ die("1-8の範囲外が入力されました\n"); } | |
448 | + if($_==1){$flag_date_type = 'YYmmDD'; } | |
449 | + elsif($_==2){$flag_date_type = 'YYYYmmDD'; } | |
450 | + elsif($_==3){$flag_date_type = 'YYmmDDHHMM'; } | |
451 | + elsif($_==4){$flag_date_type = 'YYYYmmDDHHMM'; } | |
452 | + elsif($_==5){$flag_date_type = 'YY-mm-DD'; } | |
453 | + elsif($_==6){$flag_date_type = 'YYYY-mm-DD'; } | |
454 | + elsif($_==7){$flag_date_type = 'YY-mm-DD-HHMM'; } | |
455 | + elsif($_==8){$flag_date_type = 'YYYY-mm-DD-HHMM'; } | |
456 | + | |
457 | + print("日付形式 : ".$flag_date_type."\n\n"); | |
458 | + } | |
459 | + | |
460 | + print("ファイル名形式の選択\n1.日時-元ファイル名.jpg\n2.元ファイル名-日時.jpg\n3.日時.jpg\n". | |
461 | + "\n(1-3) [1] : "); | |
462 | + $_ = <STDIN>; | |
463 | + chomp; | |
372 | 464 | if(length($_)<=0){ $_ = 1; } |
373 | - if(int($_)<1 || int($_)>8){ die("1〜8の範囲外が入力されました\n"); } | |
374 | - if($_==1){$flag_date_type = 'YYmmDD'; } | |
375 | - elsif($_==2){$flag_date_type = 'YYYYmmDD'; } | |
376 | - elsif($_==3){$flag_date_type = 'YYmmDDHHMM'; } | |
377 | - elsif($_==4){$flag_date_type = 'YYYYmmDDHHMM'; } | |
378 | - elsif($_==5){$flag_date_type = 'YY-mm-DD'; } | |
379 | - elsif($_==6){$flag_date_type = 'YYYY-mm-DD'; } | |
380 | - elsif($_==7){$flag_date_type = 'YY-mm-DD-HHMM'; } | |
381 | - elsif($_==8){$flag_date_type = 'YYYY-mm-DD-HHMM'; } | |
465 | + if(int($_)<1 || int($_)>3){ die("1-3の範囲外が入力されました\n"); } | |
466 | + if($_==1){$flag_fname_style = 'date-base'; } | |
467 | + elsif($_==2){$flag_fname_style = 'base-date'; } | |
468 | + elsif($_==3){$flag_fname_style = 'date'; } | |
382 | 469 | |
383 | - print("日付形式 : ".$flag_date_type."\n\n"); | |
470 | + print("ファイル名形式 : ".$flag_fname_style."\n\n"); | |
384 | 471 | |
472 | + if($flag_fname_style eq 'date' && $flag_undo_mode == 1){ | |
473 | + die("元のファイル名が失われていますので Undo できません。\n"); | |
474 | + } | |
475 | + | |
385 | 476 | printf("同時に、ファイル名を小文字に変換しますか? (Y/N) [Y] : "); |
386 | 477 | $_ = <STDIN>; |
387 | 478 | chomp; |
@@ -414,7 +505,7 @@ | ||
414 | 505 | } |
415 | 506 | |
416 | 507 | # ファイル一覧を得て、配列に格納 |
417 | - @arrScan = glob($strScanPattern); | |
508 | + @arrScan = glob(sub_conv_to_local_charset($strScanPattern)); | |
418 | 509 | |
419 | 510 | # 各ファイルのディレクトリ名、Exif日時を配列 @arrImageFiles に格納 |
420 | 511 | foreach(@arrScan) |
@@ -421,7 +512,7 @@ | ||
421 | 512 | { |
422 | 513 | if(length($_) <= 0){ next; } |
423 | 514 | $_ = sub_conv_to_flagged_utf8($_); |
424 | - $exifTool->ImageInfo($_); | |
515 | + $exifTool->ImageInfo(sub_conv_to_local_charset($_)); | |
425 | 516 | $tmpDate = $exifTool->GetValue('CreateDate'); |
426 | 517 | if(!defined($tmpDate)){ $tmpDate = 0; } # Exifが無い場合は 0 |
427 | 518 | else{ |
@@ -428,7 +519,15 @@ | ||
428 | 519 | my @arrTime_t = split(/,/,$tmpDate); |
429 | 520 | $tmpDate = mktime($arrTime_t[5], $arrTime_t[4], $arrTime_t[3], $arrTime_t[2], $arrTime_t[1]-1, $arrTime_t[0]-1900); |
430 | 521 | } |
431 | - my @arrTemp = ($_, dirname($_), basename($_), $tmpDate); | |
522 | + my $str_dirname = dirname($_); | |
523 | + unless($str_dirname =~ /\/$/){ $str_dirname .= '/'; } # ディレクトリ名は末尾が / で終わるよう調整 | |
524 | + my @arrTemp = ($_, # [0]: 元ファイルのフルパス | |
525 | + $str_dirname, # [1]: ディレクトリ名 | |
526 | + basename($_, @arrKnownExt), # [2]: 拡張子抜きのbasename | |
527 | + $tmpDate, # [3]: 日時unix時刻 | |
528 | + '' # [4]: 変更後のファイル名 | |
529 | + ); | |
530 | + | |
432 | 531 | push(@arrImageFiles, \@arrTemp); |
433 | 532 | } |
434 | 533 |
@@ -435,6 +534,17 @@ | ||
435 | 534 | } |
436 | 535 | |
437 | 536 | |
537 | +# 対象画像ファイルの配列をソートする | |
538 | +sub sub_sort_imagefiles { | |
539 | + | |
540 | + # unux時間でソートする | |
541 | + | |
542 | + @arrImageFiles = sort { @$a[3] <=> @$b[3]} @arrImageFiles; | |
543 | + | |
544 | +} | |
545 | + | |
546 | + | |
547 | + | |
438 | 548 | # ファイルのリネーム |
439 | 549 | sub sub_rename_main { |
440 | 550 |
@@ -446,55 +556,41 @@ | ||
446 | 556 | |
447 | 557 | $strReturn .= "対象ディレクトリ : ".$arrImageFiles[0][1]."\n\n"; |
448 | 558 | |
449 | - foreach(@arrImageFiles){ | |
450 | - if(length($_->[3])<8){ $strReturn .= "-- : ".$_->[2]." (no exif)\n"; } | |
559 | + for(my $i=0; $i<=$#arrImageFiles; $i++){ | |
560 | + if(length($arrImageFiles[$i][3])<8){ | |
561 | + $strReturn .= "-- : ".$arrImageFiles[$i][2]." (no exif)\n"; | |
562 | + $arrImageFiles[$i][4] = $arrImageFiles[$i][2].'.jpg'; # 新ファイル名リストに入れる(ファイル名重複検査用) | |
563 | + } | |
451 | 564 | else{ |
452 | - my @tm = localtime($_->[3]); | |
453 | - my $strFormat; | |
454 | - my $nFormatYear; | |
455 | - if($flag_date_type eq 'YYmmDD'){ $strFormat = "%02d%02d%02d"; $nFormatYear = ($tm[5]+1900)%100; } | |
456 | - elsif($flag_date_type eq 'YYYYmmDD'){ $strFormat = "%04d%02d%02d"; $nFormatYear = ($tm[5]+1900);} | |
457 | - elsif($flag_date_type eq 'YYmmDDHHMM'){ $strFormat = "%02d%02d%02d%02d%02d"; $nFormatYear = ($tm[5]+1900)%100;} | |
458 | - elsif($flag_date_type eq 'YYYYmmDDHHMM'){ $strFormat = "%04d%02d%02d%02d%02d"; $nFormatYear = ($tm[5]+1900);} | |
459 | - elsif($flag_date_type eq 'YY-mm-DD'){ $strFormat = "%02d-%02d-%02d"; $nFormatYear = ($tm[5]+1900)%100; } | |
460 | - elsif($flag_date_type eq 'YYYY-mm-DD'){ $strFormat = "%04d-%02d-%02d"; $nFormatYear = ($tm[5]+1900);} | |
461 | - elsif($flag_date_type eq 'YY-mm-DD-HHMM'){ $strFormat = "%02d-%02d-%02d-%02d%02d"; $nFormatYear = ($tm[5]+1900)%100;} | |
462 | - elsif($flag_date_type eq 'YYYY-mm-DD-HHMM'){ $strFormat = "%04d-%02d-%02d-%02d%02d"; $nFormatYear = ($tm[5]+1900);} | |
463 | - else{ $strFormat = "%02d%02d%02d"; $nFormatYear = ($tm[5]+1900)%100; } | |
464 | - | |
465 | - my $strYMD = sprintf($strFormat, $nFormatYear, # year | |
466 | - $tm[4]+1, # month | |
467 | - $tm[3], # day | |
468 | - $tm[2], # hour | |
469 | - $tm[1] # sec | |
470 | - ); | |
471 | - | |
472 | - if($flag_change_lowercase == 1){ $_->[2] = lc($_->[2]); } # ファイル名の小文字化 | |
565 | + my $strNewName = sub_make_new_filename($arrImageFiles[$i][2], $arrImageFiles[$i][3]); | |
566 | + $arrImageFiles[$i][4] = $strNewName; # 新ファイル名リストに入れる(ファイル重複検査用) | |
567 | + $strNewName = $arrImageFiles[$i][1].$strNewName; | |
473 | 568 | |
474 | - my $strNewName = sprintf("%s/%s-%s", $_->[1], # dir | |
475 | - $strYMD, # YMD | |
476 | - $_->[2] # filename | |
477 | - ); | |
478 | - | |
479 | - if(length($strYMD)<length($_->[2]) && substr($_->[2], 0, length($strYMD)) eq $strYMD) { | |
480 | - # 改名済みの時は、スキップ | |
481 | - $strReturn .= "-- : ".$_->[2]."\n"; | |
569 | + if($arrImageFiles[$i][0] eq $strNewName){ | |
570 | + # 変更前後のファイル名が同一の時、何もしない | |
571 | + $strReturn .= "---- : ".basename($arrImageFiles[$i][0])." == ".basename($strNewName)."\n"; | |
482 | 572 | } |
483 | 573 | else{ |
484 | 574 | # 改名する |
485 | 575 | if($flag_preview eq 'preview'){ |
486 | 576 | # プレビューモード |
487 | - $strReturn .= "変更 : ".$_->[2]." -> ".basename($strNewName)."\n"; | |
577 | + $strReturn .= "変更 : ".basename($arrImageFiles[$i][0])." -> ".basename($strNewName)."\n"; | |
488 | 578 | $nCount++; |
489 | 579 | } |
490 | 580 | else { |
491 | 581 | # 改名 |
492 | -print("debug:".$_->[0]."->".$strNewName."\n"); | |
493 | - if(rename($_->[0], $strNewName) == 1){ | |
494 | - $strReturn .= "変更 : ".$_->[2]." -> ".basename($strNewName)."\n"; | |
582 | + my $strT = '.'; | |
583 | + for(1 .. 5){ $strT .= sub_rand_char(); } | |
584 | + my $strTempFile = $arrImageFiles[$i][0] . $strT; | |
585 | + | |
586 | + if(rename(sub_conv_to_local_charset($arrImageFiles[$i][0]), | |
587 | + sub_conv_to_local_charset($strTempFile)) == 1 && | |
588 | + rename(sub_conv_to_local_charset($strTempFile), | |
589 | + sub_conv_to_local_charset($strNewName)) == 1){ | |
590 | + $strReturn .= "変更 : ".basename($arrImageFiles[$i][0])." -> ".basename($strNewName)."\n"; | |
495 | 591 | $nCount++; |
496 | 592 | } |
497 | - else{ $strReturn .= "失敗 : ".$_->[2]."\n"; } | |
593 | + else{ $strReturn .= "失敗 : ".basename($arrImageFiles[$i][0])."\n"; } | |
498 | 594 | } |
499 | 595 | } |
500 | 596 | } |
@@ -502,6 +598,9 @@ | ||
502 | 598 | |
503 | 599 | if($flag_preview eq 'preview'){ |
504 | 600 | $strReturn .= "\n".sprintf("%d 個のファイル中、対象画像は %d 個です", $#arrImageFiles + 1, $nCount)."\n"; |
601 | + | |
602 | + # 新ファイル名(チェック用)をクリア | |
603 | + for(my $i=0; $i<=$#arrImageFiles; $i++){ $arrImageFiles[$i][4] = ''; } | |
505 | 604 | } |
506 | 605 | else{ |
507 | 606 | $strReturn .= "\n".sprintf("%d 個のファイルを改名しました", $nCount)."\n"; |
@@ -511,6 +610,79 @@ | ||
511 | 610 | } |
512 | 611 | |
513 | 612 | |
613 | +# 改名予定のファイル名と一致しない、新ファイル名を生成する。(末尾に-000から-999の枝番を振る) | |
614 | +sub sub_make_new_filename{ | |
615 | + my $strOrgBasename = shift; | |
616 | + my $tm = shift; | |
617 | + | |
618 | + my @arr_basename = split(/-/, $strOrgBasename); | |
619 | + if($flag_fname_style eq 'date-base'){ $strOrgBasename = $arr_basename[$#arr_basename]; } | |
620 | + if($flag_fname_style eq 'base-date'){ $strOrgBasename = $arr_basename[0]; } | |
621 | + | |
622 | + my @tm = localtime($tm); | |
623 | + my $strFormat; | |
624 | + my $nFormatYear; | |
625 | + if($flag_date_type eq 'YYmmDD'){ $strFormat = "%02d%02d%02d"; $nFormatYear = ($tm[5]+1900)%100; } | |
626 | + elsif($flag_date_type eq 'YYYYmmDD'){ $strFormat = "%04d%02d%02d"; $nFormatYear = ($tm[5]+1900);} | |
627 | + elsif($flag_date_type eq 'YYmmDDHHMM'){ $strFormat = "%02d%02d%02d%02d%02d"; $nFormatYear = ($tm[5]+1900)%100;} | |
628 | + elsif($flag_date_type eq 'YYYYmmDDHHMM'){ $strFormat = "%04d%02d%02d%02d%02d"; $nFormatYear = ($tm[5]+1900);} | |
629 | + elsif($flag_date_type eq 'YY-mm-DD'){ $strFormat = "%02d-%02d-%02d"; $nFormatYear = ($tm[5]+1900)%100; } | |
630 | + elsif($flag_date_type eq 'YYYY-mm-DD'){ $strFormat = "%04d-%02d-%02d"; $nFormatYear = ($tm[5]+1900);} | |
631 | + elsif($flag_date_type eq 'YY-mm-DD-HHMM'){ $strFormat = "%02d-%02d-%02d-%02d%02d"; $nFormatYear = ($tm[5]+1900)%100;} | |
632 | + elsif($flag_date_type eq 'YYYY-mm-DD-HHMM'){ $strFormat = "%04d-%02d-%02d-%02d%02d"; $nFormatYear = ($tm[5]+1900);} | |
633 | + else{ $strFormat = "%02d%02d%02d"; $nFormatYear = ($tm[5]+1900)%100; } | |
634 | + | |
635 | + my $strYMD = sprintf($strFormat, $nFormatYear, # year | |
636 | + $tm[4]+1, # month | |
637 | + $tm[3], # day | |
638 | + $tm[2], # hour | |
639 | + $tm[1] # sec | |
640 | + ); | |
641 | + | |
642 | + if($flag_change_lowercase == 1){ $strOrgBasename = lc($strOrgBasename); } # ファイル名の小文字化 | |
643 | + | |
644 | + # 新ファイル名を決定する | |
645 | + my $strNewName = undef; | |
646 | + if($flag_undo_mode == 1){ | |
647 | + $strNewName = $strOrgBasename.'.jpg'; | |
648 | + } | |
649 | + elsif($flag_fname_style eq 'date-base'){ | |
650 | + $strNewName = sprintf("%s-%s.jpg", $strYMD, $strOrgBasename); | |
651 | + } | |
652 | + elsif($flag_fname_style eq 'base-date'){ | |
653 | + $strNewName = sprintf("%s-%s.jpg", $strOrgBasename, $strYMD); | |
654 | + } | |
655 | + elsif($flag_fname_style eq 'date'){ | |
656 | + $strNewName = sprintf("%s.jpg", $strYMD); | |
657 | + } | |
658 | + | |
659 | + # 内部サブルーチン(ファイル名リスト内で一致すれば1を返す) | |
660 | + my $include = sub { $_=shift; for(my $i=0; $i<=$#arrImageFiles; $i++){ if($_ eq $arrImageFiles[$i][4]){ return(1); } } return(0); }; | |
661 | + | |
662 | + # 改名予定の新ファイル名リストに一致していれば、枝番を振る | |
663 | + for(my $i=1; $i<=1000; $i++){ | |
664 | + if(&$include($strNewName) == 1) | |
665 | + { | |
666 | + if($i >= 1000){ die("exceed counter 999 at ".$strOrgBasename."\n"); } | |
667 | + if($flag_undo_mode == 1){ | |
668 | + $strNewName = sprintf("%s-%03d.jpg", $i, $strOrgBasename); | |
669 | + } | |
670 | + elsif($flag_fname_style eq 'date-base'){ | |
671 | + $strNewName = sprintf("%s-%03d-%s.jpg", $strYMD, $i, $strOrgBasename); | |
672 | + } | |
673 | + elsif($flag_fname_style eq 'base-date'){ | |
674 | + $strNewName = sprintf("%s-%s-%03d.jpg", $strOrgBasename, $strYMD, $i); | |
675 | + } | |
676 | + elsif($flag_fname_style eq 'date'){ | |
677 | + $strNewName = sprintf("%s-%03d.jpg", $strYMD, $i); | |
678 | + } | |
679 | + } | |
680 | + else{ last; } | |
681 | + } | |
682 | + | |
683 | + return($strNewName); | |
684 | +} | |
685 | + | |
514 | 686 | # 任意の文字コードの文字列を、UTF-8フラグ付きのUTF-8に変換する |
515 | 687 | sub sub_conv_to_flagged_utf8{ |
516 | 688 |
@@ -562,5 +734,29 @@ | ||
562 | 734 | } |
563 | 735 | |
564 | 736 | |
737 | +# UTF8から現在のOSの文字コードに変換する | |
738 | +sub sub_conv_to_local_charset{ | |
739 | + my $str = shift; | |
740 | + | |
741 | + # UTF8から、指定された(OSの)文字コードに変換する | |
742 | + $str = Encode::encode($flag_charcode, $str); | |
743 | + | |
744 | + return($str); | |
745 | +} | |
746 | + | |
747 | + | |
748 | +# ランダムな文字を作成する | |
749 | +sub sub_rand_char { | |
750 | + | |
751 | + my @arrSeedChars = (); | |
752 | + | |
753 | + push @arrSeedChars, ('a'..'z'); | |
754 | + push @arrSeedChars, ('A'..'Z'); | |
755 | + push @arrSeedChars, ('0'..'9'); | |
756 | + | |
757 | + return $arrSeedChars[int(rand($#arrSeedChars+1))]; | |
758 | +} | |
759 | + | |
760 | + | |
565 | 761 | # スクリプト終了 EOF |
566 | 762 |