Eu criei um arquivo PERL, mas como é bastante simpista, parece um pouco 'exagero' enviar às pessoas 16 MB de PERL em um pendrive apenas para executar um programa, então me pergunto se um arquivo em lote menor do DOS poderia funcionar. parte importante -EXIFTOOL - pode ser executada a partir do CMD (incluirei o código em breve).
Aqui está o arquivo txt da hora:
ABC|10:15
DEF|10:30
XYZ|10:40
O script carrega as fotos, coloca-as em ordem numérica (em vez de 1, 10, 2, 20 que a classificação básica fornece) e, usando EXIF, descobre quando a foto foi tirada. Ele retira os dois valores principais do arquivo. "Se tempo> A && tempo <B mover para a pasta" Portanto, um carimbo de data / hora de 10h16, 10h20, 10h25 é movido para ABC.
No entanto, o carimbo de data / hora 10:33 está acima de B ... então ele torna B o novo A e sai do arquivo de texto da próxima vez (10:40). Agora ele move qualquer carimbo de data / hora entre 10:30 e 10:40 para a pasta DEF. (Eu adiciono uma entrada fictícia ao final do arquivo de tempo para que o X+1 não tente ler o final do arquivo. O loop é definido como @ data-1. Portanto, se o arquivo tiver 12 linhas, ele fará um loop para 11, e lê x+1 da linha fictícia no final... que é AGORA, e nenhuma foto terá esse carimbo de data/hora)
Você acha que esses loops/diretórios de leitura/instruções if podem ser condensados em um arquivo em lote simples?
#!/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";