Thread sortiertes files aus Dir A nach Dir B copieren (4 answers)
Opened by Henry07 at 2021-12-19 16:04

haj
 2021-12-19 17:30
#194107 #194107
User since
2015-01-07
558 Artikel
BenutzerIn

user image
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:
Code (perl): (dl )
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;

# Eliminate entries starting with '.'
@files = grep { $_ !~ /^\./ } @files;

# Split the file names in their numeric and non-numeric part
my @unsorted = map { [/^(\d+)(.*)/] } @files;

# Sort by numbers first, non-numeric part second
my @sorted = sort { $a->[0] <=> $b->[0]  or
                 $a->[1] cmp $b->[1] } @unsorted;

# ...and re-build the filenames, re-using our old array
@files = map { $_->[0] . $_->[1] } @sorted;

# Finally, copy the stuff
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)

View full thread sortiertes files aus Dir A nach Dir B copieren