일괄 처리에 상응하는 Perl 스크립트

일괄 처리에 상응하는 Perl 스크립트

PERL 파일을 만들었지만 다소 단순하기 때문에 하나의 프로그램을 실행하기 위해 사람들에게 USB 스틱에 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";

관련 정보