Perlskript erzeugt Schrott

#!/usr/bin/perl

chdir("…/Bilder");
push(@bilder, glob"*.JPG");
push(@bilder, glob"*.jpg");
$i = 1;

foreach (@bilder)
{
rename „$_“, „Daenemark$i.jpg“;
print „$_ --> Daenemark$i.jpg\n“;
$i++;
}

Dieses Skript auf Linux ausgeführt, funktioniert beim ersten Aufruf so wies soll. Bei mehrmaligem Ausführen des Skripts werden einige der Dateien gelöscht. Warum???

Auf Win auf der Kommandozeile ausgeführt erzeugt dieses Skript merkwürdige Ausgaben. Das heißt: Auf der Eingabeaufforderung erzeugt das Skript Ausgaben als währen es mehr als das doppelte der „gefütterten“ Dateien. Aber im WinExplorer stimmt alles. Warum???

#!/usr/bin/perl

chdir("…/Bilder");
push(@bilder, glob"*.JPG");
push(@bilder, glob"*.jpg");
$i = 1;

foreach (@bilder)
{
rename „$_“, „Daenemark$i.jpg“;
print „$_ --> Daenemark$i.jpg\n“;
$i++;
}

Dieses Skript auf Linux ausgeführt, funktioniert beim ersten
Aufruf so wies soll. Bei mehrmaligem Ausführen des Skripts
werden einige der Dateien gelöscht. Warum???

Hi David,
das mit dem Schrott kann ich so nicht stehen lassen. Ich habs unter UNIX (z.Zt. Solaris) ausprobiert.

Du solltest dir mal dein Array @bilder ausgeben lassen ('print join(" - ", @bilder), „\n“;#), dann siehst du wahrscheinlich das Problem. Die ‚glob‘-Funktion liefert die Dateinamen in lexikalischer Sortierung, daher hast du beim zweiten Durchlauf auch dein Problem (Reihenfolge: Daenemark1…, D10, D11, … 2, 3, 4,…). Bei mehr als 9 Dateien wird munter umbenannt:

D1 -\> D1 # nichts passiert
D10 -\> D2 # Hokuspokus: weg ist die ursprüngliche D2
D11 -\> D3 # weg ist D3 ...
usw.

Lösung: entweder prüfen, ob die Zieldatei schon existiert (dann besser nicht umbenennen), oder z.B. den Zaehler im Filnamen groß und eindeutig machen (z.B. 4stellig mit führender Null), damit im Problemfall die numerische = lexikalische Sortierung ist.

Gruß
bernhard