Das einfache zuerst: Die Namen der Ausgabedateien bekommst Du durch einfaches Hochzählen.
Bei den Eingabedateien kann's ein paar Komplikationen geben, je nachdem, wie Dein Verzeichnis ausschaut.
- Einfach ist es, wenn es nie weiter als bis 9 geht.
- Wenn Du mal 10 oder mehr Bilder drin hast, hängt es davon ab, ob Du führende Nuller in den Dateinamen hast - oder im Ausgabeverzeichnis haben willst. Denn nur, wenn alle Nummern die gleiche Anzahl von Ziffern haben, führen alphabetisches und numerisches Sortieren zum gleichen Resultat.
In jedem Fall kannst Du nicht, wie in Deiner letzten Frage, über die
readdir-Aufrufe schleifen, sondern Du musst Dir zuerst eine komplette Liste der Dateinamen einsammeln. Hier mal ein Beispiel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use 5.020;
use warnings;
use File::Copy;
my $in_dir = '/tmp/foo';
my $out_dir = '/tmp/bar';
opendir(my $dir_handle, $in_dir)
or die "Can't open directory '$in_dir': '$!'\n";
my @files = readdir($dir_handle);
closedir $dir_handle;
@files = grep { $_ !~ /^\./ } @files;
my @unsorted = map { [/^(\d+)(.*)/] } @files;
my @sorted = sort { $a->[0] <=> $b->[0] or
$a->[1] cmp $b->[1] } @unsorted;
@files = map { $_->[0] . $_->[1] } @sorted;
my $file_number = 1;
for my $file(@files) {
copy("$in_dir/$file", "$out_dir/${file_number}.gif")
or die "The copy operation for '$file' failed: '$!'";
$file_number++;
}
Die Abfolge
map / sort / map ist unter dem Namen
Schwartzian Transform bekannt. Leute, die das oft machen, schreiben das in einem einzigen Statement, aber darauf habe ich hier mal verzichtet :)
Last edited: 2021-12-19 17:33:06 +0100 (CET)