Hi Alex,
Ich will ein Perl-Programm schreiben, welches sämtliche Dateien und
Unter-Verzeichnisse eines bestimmten Verzeichnisses in ein anderes
Verzeichnis verschiebt. oder kurz gesagt: ein ganzer verzeichnis-baum
soll verschoben werden.
falls Du wirklich "verschoben" meinst und mit "anderes Verzeichnis" wirk-
lich nur "Verzeichnis" und nicht "Laufwerk" oder was auch immer meinst,
dann verstehe ich Dein Problem nicht so recht.
Sowohl "mv" unter UNIX als auch "move" unter Windows verschieben das
Wurzelverzeichnis inklusive des gesamten Baums darunter - fertig.
Das funktioniert natürlich nur, solange durch die Verschiebung alleine
durch eine Neu-Verkettung des Verzeichnisbaums möglich ist, d. h. solange
die Dateien und Verzeichnisse an ihrem ursprünglichen Ort bleiben dürfen.
Müssen diese Daten dagegen auf ein anderes Laufwerk übertragen werden,
dann beginnt Dein Problem, plattformspezifisch zu werden:
- Unter UNIX erkennt das Betriebssystem automatisch, daß es nun kopieren
und löschen muß; - unter Windows scheint es (nach einem gerade durchgeführten flüchtigen
Versuch) einfach nicht möglich zu sein, 'move' zu verwenden, und Du
müßtest in diesem Falle tatsächlich das tun, was Du ohnehin tun woll-
test: Explizit kopieren und löschen.
Eine Idee zur Realisierung hab ich schon: mit opendir und readdir die
einzelnen Verzeichnisse rekursiv durchgehen, gleichnamige Unter-
Verzeichnisse im Ziel-Verzeichnis anlegen, Dateien kopieren,
anschließend die kopierten Dateien löschen (rm), anschließend die
leeren Verzeichnisse löschen (rmdir).
So weit so gut, aber ziemlich umständlich, oder?
Auch das kommt m. E. wieder auf Deine Plattform an.
SunOS (und wahrscheinlich alle UNIXe) unterstützt im 'mkdir'-Befehl
den Parameter '-p', so daß Du mit einem Befehl einen kompletten Pfad
anlegen kannst, statt rekursiv jedes einzelne Verzeichnis anzulegen.
Weil 'mkdir -p' alles in einem Rutsch macht, ist es insbesondere auch
noch wesentlich performanter als viele einzelne 'mkdir's.
Zweiter Tip: Wenn Du sämtliche Pfade von anzulegenden Verzeichnissen
hast, sammele sie in einem Hash auf (sofern Du Dir das vom RAM-Bedarf
her leisten kannst ...) und eliminiere anschließend alle Präfixe von
bereits existierenden Pfaden. Damit erhältst Du die minimale Anzahl von
'mkdir -p'-Befehlen, um Deinen kompletten Baum zu erzeugen.
Das Löschen eines Baums geht unter UNIX mit 'rm -rf <wurzel>' wesentlich
einfacher, als den ganzen Baum selbst zu traversieren.
oder gibt es vielleicht schon ein Modul, was genau diese Funktionalität
anbietet?
Wie gesagt: Zuerst solltest Du prüfen, ob ein einfaches Umbenennen des
Wurzelverzeichnisses nicht schon ausreicht.
Alle meine Lösungsvorschläge bezogen sich auf Betriebssystemfunktionen,
nicht auf Perl. Dein Anwendungsfall ist aber auch sehr betriebssystem-nah;
gerade deshalb solltest Du nicht unbedingt versuchen, etwas in Perl nach-
zubauen, was das Betriebssystem ohnehin können muß.
(Es sei denn, Plattformabhängigkeit ist in Deinem Falle wesentlich; sie
kann Dich aber hier einen nennenswerten Faktor an Performance kosten.)
Viele Grüße
Michael