我創建了一個PERL 文件,但由於它相當簡單,在U 盤上向人們發送16MB PERL 只是為了運行一個程序似乎有點“殺傷力”,所以想知道是否可以使用較小的DOS 批處理文件。知道最重要部分 -EXIFTOOL - 可以從 CMD 運行(我將立即包含程式碼)。
這是時間txt檔案:
ABC|10:15
DEF|10:30
XYZ|10:40
該腳本加載照片,將它們按數字順序排列(而不是基本排序給出的 1、10、2、20),並使用 EXIF 查找照片的拍攝時間。它從文件中取出前兩個值。 「如果時間 > A && 時間 < B 移動到資料夾」 因此 10:16、10:20、10:25 的時間戳記將會移到 ABC。
然而,10:33 時間戳在B 之上...所以它使B 成為新的A,並在下一次關閉文本文件(10:40) 因此現在它將10:30 和10:40 之間的任何時間戳移動到資料夾DEF。 (我在時間文件的末尾添加了一個虛擬條目,因此 X+1 不會嘗試讀取文件末尾。循環設置為 @data-1。因此,如果文件長 12 行,它將循環遍歷到11,並從末尾的虛擬行讀取x+1...這是現在,沒有照片將具有該時間戳記)
您認為這些循環/讀取目錄/if 語句可以壓縮成一個簡單的批次檔嗎?
#!/usr/bin/perl
use v5.10;
use strict;
use warnings;
my $photoFolder='../../EventsSoft/photos';
use Image::ExifTool;
use File::Copy;
use Time::Local;
### IMPORTANT ###
my $mainFolder='AHS_school';
### IMPORTANT ###
if (!defined $mainFolder || $mainFolder eq ''){
mkdir $photoFolder.'/temp';
$mainFolder='temp';
}
elsif (not -e $photoFolder.'/'.$mainFolder){
mkdir $photoFolder.'/'.$mainFolder;
}
my $exif=new Image::ExifTool;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$currentFile,$nextFile,$barcode,$dummy);
my @timePic;
my @checkPics;
opendir my $ht, $photoFolder or die "Could not open photo folder for reading '$!'\n";
my @ht = grep {/\.jpg$/} readdir $ht; # Only keep the JPG files
closedir $ht;
@checkPics = map { $_->[0] } # Sorts the files so run 1,2,3 not 1,11,12
sort { $a->[1] <=> $b->[1] }
map { [$_, $_=~/(\d+)/] } @ht;
for (my $x=0; $x<@checkPics; $x++){
$exif->ExtractInfo($photoFolder.'/'.'photo'.$x.'.jpg');
$timePic[$x]=$exif->GetValue('CreateDate');
}
open (my $fh, '<', $photoFolder.'/photog1.dat') or die "Could not open photog1.dat for reading '$!'\n";
my @data=<$fh>;
close($fh);
chomp @data;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if ($mon eq 11){
$mon=0;
}
else{
$mon++;
}
my $str = sprintf ("%02d:%02d %02d:%02d:%02d", $mon, $mday, $hour, $min, $sec);
my $fakeTime='XXXXXX|'.($year+1900).':'.$str;
push (@data,$fakeTime); # Saves time in ISO format
# @data holds the time barcode scanned in the format XXXAGK|2019-03-15 11:14:00
# @checkPics holds the image filename
# @timePic holds time photo was taken
# The fake entry stops reading beyond end of file with ($y+1) option below. Np photos would have been taken at this time/date
for (my $x=0; $x<@data-1; $x++){
($barcode,$currentFile)=split('\|',$data[$x]); # Gets the top value off data, and gets the barcode
($dummy,$nextFile)=split('\|',$data[($x+1)]); # Gets the next value down - files to be below this value
for (my $y=0;$y<@timePic; $y++){
if ($timePic[$y] eq 0){
next;
}
if ($timePic[$y] lt $nextFile){
mkdir $photoFolder.'/'.$mainFolder.'/'.$barcode;
copy ($photoFolder.'/'.$checkPics[$y], $photoFolder.'/'.$mainFolder.'/'.$barcode.'/'.$checkPics[$y]) or die "Copy failed line 70 '$!'\n";
$timePic[$y]=0;
}
if ($timePic[$y] gt $nextFile){
last;
}
}
}
## Because the above loop is @data-1; we do not get to the last entry, so need one final loop
my $picEnd=@data;
($barcode,$dummy)=split('\|',$data[$picEnd-2]); # Gets the final barcode
for (my $y=0;$y<@timePic; $y++){
if ($timePic[$y] eq 0){
next;
}
mkdir $photoFolder.'/'.$mainFolder.'/'.$barcode;
copy ($photoFolder.'/'.$checkPics[$y], $photoFolder.'/'.$mainFolder.'/'.$barcode.'/'.$checkPics[$y]) or die "Copy failed line 86'$!'\n";
}
if ($mainFolder eq 'temp'){
rename $photoFolder.'/temp',$photoFolder.'/!! TEMP !!';
}
say "All photos have been moved to their respective folders";