Mit dem Befehl rename können Sie Dateien und Verzeichnisse umbenennen. Der Syntax von rename lautet rename (Altername, Neuername);
Altername gibt die Datei oder das Verzeichnis an, das geändert werden soll, Neuername ist der neue Verzeichnis- bzw. Dateiname. Vorsicht
Wenn der erste Parameter eine Datei ist und der zweite Parameter der Name eines anderen Verzeichnisses, wird die Datei in das andere Verzeichnis verschoben.
Es ist jedoch mit dieser Funktion nicht möglich, als ersten und zweiten Parameter zwei unterschiedliche Verzeichnisse anzugeben, um das erste Verzeichnis in das zweite zu verschieben.
Als Rückgabewert gibt es ein true, wenn alles geklappt hat, ein false, wenn ein Fehler aufgetreten ist.
Ein Beispiel, alle .htm-Dateien des Verzeichnisses test in .html umbenennen:
opendir (DIR,'test') || die "Kann Verzeichnis nicht oeffnen";
while ( my $ak=readdir(DIR) ){ push (@dateien,$ak) if ( !-d $ak && $ak=~ /\.htm$/i ); # wenn Eintrag kein Verzeichnis und Endung = .htm, dann Eintrag in @dateien schreiben
}
closedir (DIR);
foreach (@dateien){ my $orig=$_;
$_=~ s/\.htm$/\.html/i; # Endung .htm in .html ändern rename ($orig,$_) || die "Kann Datei $orig nicht umbenennen"; print "Benenne $orig um in $_\n";
Das Script liest zu erst alle Dateien mit der Endung .htm (Gross-Kleinschreibung egal) aus dem Verzeichnis test in das Array @dateien ein. Danach wird das Verzeichnis test als aktuelles Verzeichnis gesetzt,
und das Array @dateien wird Element für Element durchgegangen. Der originale Dateiname wird in $orig gemerkt, danach wird die Endung des aktuellen Elementes von .htm in .html geändert. Schließlich wird die Datei umbenannt.
Übrigens
...auch wenn das gerade hier nicht hin gehört:
Nach der erfolgreichen Umbenennung aller Dateien steht in @dateien die aktualisierte Fassung der einzelnen Dateien. Warum? Nun, $_ ändert in der foreach-Schleife automatisch den Originaleintrag in @dateien. Vorsicht also, falls man die Originaldateinamen nochmal braucht!
Im vorliegenden Fall ist dies aber eher ein Vorteil, da ja @dateien jetzt dem aktuellen Zustand entspricht.
Kommentare zum Beitrag "rename - Dateien und Verzeichnis umbenennen"
Kommentar von error
hallo, das Programm ist Super, auf meinem PC (Win 2000) kommt aber leider immer die Fehlermeldung. Den Dateinamen lässt sich ändern, nicht aber die Endung. Woran kann das liegen?
Kommentar von Admin
Also ich habe das gerade hier nochmal durchgeguckt, auf meinem Win-XP läuft das problemlos, auf nem Linux-Server auch.
Was ich mir allerdings vorstellen kann ist, daß vielleicht unter Win2000 die Rechte nicht entsprechend gesetzt sind, also nicht die richtige Befugnis herrscht? Win2000 war das noch ziemlich, na sagen wir mal, seltsam manchmal...
Sorry, aber ich kann das im Moment so auch nicht weiter nachvollziehen...
Kommentar von Hans
funzt prima, kurz split und Pfad angepasst und schon gings
Danke!
Kommentar von danho
Was mache ich, wenn die Dateinamen Umlaute enthalten?
Beim STDOUT in eine dosbox hilft ja
binmode(STDOUT, ":encoding(cp437)") if $^O eq 'MSWin32';
Das bringt aber nix, wenn man Dateien anfassen will, die Umlaue enthalten...
Kommentar von Admin
Hm, also folgende Zeile
rename ("täst.htm","test.htm");
läuft auf meinem XP einwandfrei...
Wo liegt denn genau das Problem?
Kommentar von danho
Ich gehe per finddepth durch alle subdirs und möchte alle ulaute dateinamen ersetzen zB ö->oe.
Die gefundenen Dateien gebe ich an rename weiter.
Kannst Du mal schaun, ob das hier bei Dir läuft:
<http://www.danho.org/files/deUmlaut.pl>
Das Verzeichnis wird als Parameter übergeben, ./ ist default.
Ich bekomme folgende Ausgabe:
C:\>perl deUmlaut.pl verzeichnis aäa.mp3 Couldn't rename aΣa.mp3 to aaea.mp3: No such file or directory Oldname: aäa.mp3 Newname: aaea.mp3 datei.mp3 file.wav
Die korrekte Ausgabe per print funktioniert also...
danho
Kommentar von danho
...sorry!
Ich nehme alles zurück und behaupte das Gegenteil...
'War nur ein copy-paste Fehler im script!