Thread sortiertes files aus Dir A nach Dir B copieren
(4 answers)
Opened by Henry07 at 2021-12-19 16:04
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.
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) |