• R/O
  • SSH
  • HTTPS

renfile-exif: Commit


Commit MetaInfo

Revision4 (tree)
Time2011-01-07 23:04:37
Authorinoue-h

Log Message

version 0.4

Change Summary

Incremental Difference

--- trunc/renfile-exif.pl (revision 3)
+++ trunc/renfile-exif.pl (revision 4)
@@ -11,6 +11,7 @@
1111 # renfile_exif_date.pl
1212 # version 0.2 (2010/December/06)
1313 # version 0.3 (2011/January/04)
14+# version 0.4 (2011/January/05)
1415 #
1516 # GNU GPL Free Software
1617 #
@@ -41,8 +42,12 @@
4142 use strict;
4243 use warnings;
4344 use utf8;
45+
46+my $flag_os = 'linux'; # linux/windows
47+my $flag_charcode = 'utf8'; # utf8/shiftjis
48+
4449 use POSIX;
45-use Gtk2 qw/-init/;
50+use Gtk2 qw/-init/; # Windowsの場合は、この行をコメントアウト
4651 use Image::ExifTool;
4752 use File::Basename;
4853 use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/; # 必要ないエンコードは削除すること
@@ -51,8 +56,17 @@
5156 #use Data::HexDump;
5257
5358
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+}
5670
5771 my $strTargetDir = $ENV{'HOME'}; # 対象ディレクトリ
5872 my $flag_date_type = 'YYYY-mm-DD'; # 日時形式
@@ -59,10 +73,20 @@
5973 my $flag_change_lowercase = 1; # ファイル名を小文字に変換する
6074
6175 my @arrImageFiles = (); # 画像ファイルを格納する配列
62-my @arrFileScanMask = ('*.jpg', '*.jpeg', '*.JPG', '*.JPEG'); # 処理対象
63- # Windowsの場合は、大文字の .JPG .JPEG の記述不要
6476
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+
6587 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
6690 my $flag_verbose = 1;
6791
6892 my $return_code = undef;
@@ -69,7 +93,10 @@
6993
7094 # GUIスイッチを引数に起動されたとき(Gtk2でのユーザインターフェース対応)
7195 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+}
73100
74101 # ディクトリ、日時形式の入力
75102 if($flag_gui == 1){ $return_code = sub_user_input_init_gui(); }
@@ -78,6 +105,7 @@
78105
79106 # 対象ファイル一覧を @arrImageFiles 配列に格納する
80107 sub_scan_imagefiles();
108+sub_sort_imagefiles();
81109
82110 # 対象ファイル一覧を表示して、ファイル名変更を実行するかどうかユーザ選択させる
83111 my $strPreview = sub_rename_main('preview');
@@ -84,7 +112,8 @@
84112
85113 if($flag_gui == 1){
86114 if(length($strPreview) > 0){
87- if(sub_display_message($strPreview, "処理内容のプレビュー", "ファイル名変更処理をしますか?", "処理開始", "中止") == 0){ exit(); }
115+ if(sub_display_message($strPreview, "処理内容のプレビュー", "ファイル名変更処理をしますか?",
116+ "処理開始", "中止") == 0){ exit(); }
88117 }
89118 else {
90119 sub_display_message("", "指定されたフォルダには jpeg ファイルが見つかりませんでした", "", "", "終了");
@@ -97,7 +126,7 @@
97126 printf("ファイル名変更処理をしますか? (Y/N) [N] : ");
98127 $_ = <STDIN>;
99128 chomp($_);
100- if(length($_)<=0 || uc($_) ne 'Y'){ die("キャンセルしました\n"); }
129+ if(length($_)<=0 || uc($_) ne 'Y'){ die("User Cansel(キャンセルしました)\n"); }
101130 }
102131 else {
103132 die("対象となるファイルが見つからないため終了します\n");
@@ -171,10 +200,23 @@
171200 $combobox_datetype->append_text('年月日(YYYY-mm-DD-)');
172201 $combobox_datetype->append_text('年月日時分(YY-mm-DD-HHMM)');
173202 $combobox_datetype->append_text('年月日時分(YYYY-mm-DD-HHMM)');
174- $combobox_datetype->set_active(5);
203+ $combobox_datetype->set_active(0);
175204 $hbox_datetype->add($combobox_datetype);
176205
206+ # ファイル名形式(コンボボックス)
207+ my $hbox_filenametype = Gtk2::HBox->new();
208+ $vbox->add($hbox_filenametype);
177209
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+
178220 # ファイル名の小文字変換(チェックボックス)
179221 my $hbox_lc = Gtk2::HBox->new();
180222 $vbox->add($hbox_lc);
@@ -183,7 +225,15 @@
183225 if($flag_change_lowercase == 1){ $check_lc->set_active(1); }
184226 $hbox_lc->add($check_lc);
185227
228+ # Undoモード(チェックボックス)
229+ my $hbox_undo = Gtk2::HBox->new();
230+ $vbox->add($hbox_undo);
186231
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+
187237 # 実行・閉じるボタン
188238 my $hbox_buttons = Gtk2::HBox->new();
189239 $vbox->add($hbox_buttons);
@@ -193,7 +243,7 @@
193243 # 実行ボタンが押されたときのコールバック関数
194244 $strTargetDir = $entry_dir->get_text();
195245 if(substr($strTargetDir,-1) ne '/'){ $strTargetDir .= '/'; } # ディレクトリは / で終わるように修正
196-# $strTargetDir = Encode::encode('utf8', $strTargetDir); # Perl内部エンコードからUTF-8に変換し、かつ「UTF-8フラグを取る」
246+
197247 my $nSelected = $combobox_datetype->get_active();
198248 if($nSelected == 0){ $flag_date_type = 'YYmmDD'; }
199249 elsif($nSelected == 1){ $flag_date_type = 'YYYYmmDD'; }
@@ -203,8 +253,18 @@
203253 elsif($nSelected == 5){ $flag_date_type = 'YYYY-mm-DD'; }
204254 elsif($nSelected == 6){ $flag_date_type = 'YY-mm-DD-HHMM'; }
205255 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+
206262 if($check_lc->get_active() == 1){ $flag_change_lowercase = 1; }
207263 else{ $flag_change_lowercase = 0; }
264+
265+ if($check_undo->get_active() == 1){ $flag_undo_mode = 1; }
266+ else{ $flag_undo_mode = 0; }
267+
208268 $nReturn = 1;
209269 Gtk2->main_quit(); # ウインドウのメインループを終了する
210270 });
@@ -358,7 +418,7 @@
358418 else{ die("終了(理由:ディレクトリが入力されませんでした)\n"); }
359419 }
360420 if(substr($_,-1) ne '/'){ $_ .= '/'; } # ディレクトリは / で終わるように修正
361- unless(-d $_){ die("終了(理由:ディレクトリ ".$_." が存在しません)\n"); }
421+ unless(-d sub_conv_to_local_charset($_)){ die("終了(理由:ディレクトリ ".$_." が存在しません)\n"); }
362422 unless($_ =~ m/^\// || $_ =~ m/^\.\//){ $strTargetDir = "./".$_; }
363423 else{ $strTargetDir = $_; }
364424 $strTargetDir = sub_conv_to_flagged_utf8($strTargetDir);
@@ -365,23 +425,54 @@
365425 print("対象ディレクトリ : " . $strTargetDir . "\n\n");
366426
367427
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] : ");
370429 $_ = <STDIN>;
371430 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;
372464 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'; }
382469
383- print("日付形式 : ".$flag_date_type."\n\n");
470+ print("ファイル名形式 : ".$flag_fname_style."\n\n");
384471
472+ if($flag_fname_style eq 'date' && $flag_undo_mode == 1){
473+ die("元のファイル名が失われていますので Undo できません。\n");
474+ }
475+
385476 printf("同時に、ファイル名を小文字に変換しますか? (Y/N) [Y] : ");
386477 $_ = <STDIN>;
387478 chomp;
@@ -414,7 +505,7 @@
414505 }
415506
416507 # ファイル一覧を得て、配列に格納
417- @arrScan = glob($strScanPattern);
508+ @arrScan = glob(sub_conv_to_local_charset($strScanPattern));
418509
419510 # 各ファイルのディレクトリ名、Exif日時を配列 @arrImageFiles に格納
420511 foreach(@arrScan)
@@ -421,7 +512,7 @@
421512 {
422513 if(length($_) <= 0){ next; }
423514 $_ = sub_conv_to_flagged_utf8($_);
424- $exifTool->ImageInfo($_);
515+ $exifTool->ImageInfo(sub_conv_to_local_charset($_));
425516 $tmpDate = $exifTool->GetValue('CreateDate');
426517 if(!defined($tmpDate)){ $tmpDate = 0; } # Exifが無い場合は 0
427518 else{
@@ -428,7 +519,15 @@
428519 my @arrTime_t = split(/,/,$tmpDate);
429520 $tmpDate = mktime($arrTime_t[5], $arrTime_t[4], $arrTime_t[3], $arrTime_t[2], $arrTime_t[1]-1, $arrTime_t[0]-1900);
430521 }
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+
432531 push(@arrImageFiles, \@arrTemp);
433532 }
434533
@@ -435,6 +534,17 @@
435534 }
436535
437536
537+# 対象画像ファイルの配列をソートする
538+sub sub_sort_imagefiles {
539+
540+ # unux時間でソートする
541+
542+ @arrImageFiles = sort { @$a[3] <=> @$b[3]} @arrImageFiles;
543+
544+}
545+
546+
547+
438548 # ファイルのリネーム
439549 sub sub_rename_main {
440550
@@ -446,55 +556,41 @@
446556
447557 $strReturn .= "対象ディレクトリ : ".$arrImageFiles[0][1]."\n\n";
448558
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+ }
451564 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;
473568
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";
482572 }
483573 else{
484574 # 改名する
485575 if($flag_preview eq 'preview'){
486576 # プレビューモード
487- $strReturn .= "変更 : ".$_->[2]." -> ".basename($strNewName)."\n";
577+ $strReturn .= "変更 : ".basename($arrImageFiles[$i][0])." -> ".basename($strNewName)."\n";
488578 $nCount++;
489579 }
490580 else {
491581 # 改名
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";
495591 $nCount++;
496592 }
497- else{ $strReturn .= "失敗 : ".$_->[2]."\n"; }
593+ else{ $strReturn .= "失敗 : ".basename($arrImageFiles[$i][0])."\n"; }
498594 }
499595 }
500596 }
@@ -502,6 +598,9 @@
502598
503599 if($flag_preview eq 'preview'){
504600 $strReturn .= "\n".sprintf("%d 個のファイル中、対象画像は %d 個です", $#arrImageFiles + 1, $nCount)."\n";
601+
602+ # 新ファイル名(チェック用)をクリア
603+ for(my $i=0; $i<=$#arrImageFiles; $i++){ $arrImageFiles[$i][4] = ''; }
505604 }
506605 else{
507606 $strReturn .= "\n".sprintf("%d 個のファイルを改名しました", $nCount)."\n";
@@ -511,6 +610,79 @@
511610 }
512611
513612
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+
514686 # 任意の文字コードの文字列を、UTF-8フラグ付きのUTF-8に変換する
515687 sub sub_conv_to_flagged_utf8{
516688
@@ -562,5 +734,29 @@
562734 }
563735
564736
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+
565761 # スクリプト終了 EOF
566762
Show on old repository browser