#有中文檔名會不能移動,這應該是perl的問題,可能要改成unicode輸出才行。原本移動所有檔案的作法會慢很多,改成新作法後,處理一天幾百個檔案x2,應該在1秒內。最後動作時再次判斷檔案是否存在其實有點多餘,因為一開始收集檔名時就已經知道了,其實可以用刪除法將陣列縮減,這樣就不用再判斷一次了。

# 將選好的JPEG檔複製到NEF目錄,好的JPEG檔複製到NEF目錄,執行後將JPEG
# 檔移到JPEG目錄,沒有配對的NEF移到_del目錄,配對的NEF留在原目錄。
use strict;
use File::Copy;
use File::Basename;
use Time::HiRes qw(gettimeofday);
use 5.010;

my $t0 = gettimeofday;
my $DestRAW = "NEF/";
my $DestJPEG = "JPEG/";
my $DelFolder = "_del/";
my $FileName;
my $FileNameJ;
my $FileNameR;
my $JPGExtName = ".JPG";
my $RAWExtName = ".NEF";

my @fileJPG = glob "*.JPG";
my @fileRAW = glob "*.NEF";
my @delFile;

mkdir $DestJPEG;
mkdir $DelFolder;

#先排序
@fileJPG = sort @fileJPG;
@fileRAW = sort @fileRAW;

#say @fileJPG;
#say @fileRAW;

#檢查是RAW還是JPEG檔案比較多,先處理JPEG比較少的情況
if ($#fileJPG <= $#fileRAW) {

for (my $i = 0; $i < $#fileRAW; $i++) {
$FileName = uc substr( $fileRAW[$i], 0, length($fileRAW[$i]) - 4 );
$FileNameJ = $FileName.$JPGExtName;
$FileNameR = $FileName.$RAWExtName;

#say $FileName;
#say $FileNameJ;
#say $FileNameR;

push @delFile, $FileNameR unless (-e $FileNameJ);
}

#say $_ for (@delFile);

} else {

for (my $i = 0; $i < $#fileJPG; $i++) {
$FileName = uc substr( $fileJPG[$i], 0, length($fileJPG[$i]) - 4 );
$FileNameJ = $FileName.$JPGExtName;
$FileNameR = $FileName.$RAWExtName;

#say $FileName;
#say $FileNameJ;
#say $FileNameR;

push @delFile, $FileNameJ unless (-e $FileNameR);
}

#say $_ for (@delFile);
}

for (@delFile) {
say 'move '.$_;
move($_, $DelFolder.$_) if (-e $_);

}

for (@fileJPG) {
move($_, $DestJPEG.$_) if (-e $_);
}

my $t1 = gettimeofday;
print "Time: ".($t1 - $t0)."sec";

arrow
arrow
    全站熱搜

    bagatelles 發表在 痞客邦 留言(0) 人氣()