Alex Wolff: ganze verzeichnis-bäume verschieben

Beitrag lesen

Hi,

Ich will ein Perl-Programm schreiben, welches [...]

da Du den Bereich CGI gewählt hast: Schreibe es so, dass es außerhalb des CGI-Kontextes funktioniert, und erweitere es dann so, dass es CGI-tauglich ist.

Soll heißen: Das Problem hat mit CGI nichts zu tun, sondern betrifft nur Perl :-)

äh, ja, da bin ich etwas überfragt beim unterschied zwischen perl und cgi. ich benutze perl sowieso nur für die internet-programmierung. meine .pl-dateien werden im cgi-bin-verzeichnis abgelegt und - was wahrscheinlich die Hauptursache meines Fauxpas war - ich hab bisher alle meine probleme mit Fragen aus dem CGI-Bereich lösen können. ich wußte gar nicht, daß es einen eigenen Perl-Bereich gibt.
aber vielleicht hätte ich Perl einfach gar nicht erwähnen sollen, dann hät's schon gepasst, nich ?  ;)

Eine Idee zur Realisierung hab ich schon: mit opendir und readdir [...]

Warum nicht mit File::Find? Gut, leere Verzeichnisse werden nicht mit kopiert, das ist wahr.

aha.
mir wärs aber lieber, wenn leere Verzeichnisse auch mitkopiert werden. danke für tip!

Ich hatte mir Hoffnung gemacht, daß es mit den Modulen File::Copy und File::Path viel einfacher sein könnte, allerdings komm ich mit der Syntax nicht zurecht.

Wo genau liegen denn dabei Deine Probleme?

Ich verstehe nicht wie man statt nur eine Datei / einem Verzeichnis , mehrere kopiert / anlegt.
Aber das besondere an diesen Modulen ist doch gerade, daß man mit einem Befehl ganze Bäume anlegt oder absägt.
Ich hab mir gerade die Beschreibung für das File::Find-Modul durchgelesen und versteh jetzt - glaub ich - noch weniger ;)

find(&wanted, '/foo', '/bar');

Ich vermute mal, die Zeichenketten '/foo' und '/bar' sind irgendwie dazu da, um das/die zu durchsuchende/n Verzeichnis/se anzugeben. Konnte keine Info dazu finden... :(

Anscheinend lässt sich mit diesem Modul fast alles machen. Ich stell es mir so vor:

Wenn also

$moveroot = 'cgi-bin/sub1/sub2/sub3';

das zu verschiebende Verzeichnis ist, und

$movedestination = 'cgi-bin/othersub';

ist das Verzeichnis, in welches verschoben werden soll,
dann schreibe ich:

use File::Find;
use File::Copy;
use File::Path;

find(&wanted, $moveroot);

In der Unterfunktion wanted werden dann eine Reihe von Befehlen ausgeführt, die mit den gefundenen Dateien/Unterverzeichnissen irgendwas anstellen. Nämlich 1.: Ein Verzeichnis gleichen Namens in $movedestination anlegen
und 2.: Die Dateien aus diesem Verzeichnis verschieben.

sub wanted
{
no_chdir = true; # $_ setzt sich aus Pfad _und_ Namen zusammen
if (-d $_)
   {
   mkpath($movedestination.'/'.$_, 0, 0777);
   find(&wanted, $moveroot.'/'.$_); # find() rekursiv aufrufen für Unterverzeichnis
   }
if (-f $_)
   {
   move($_,$movedestination.'/'.$_);
   }
}

Anschließend wird das Verzeichnis $moveroot entfernt:

rmtree($moveroot, 0, 0);

Kann so etwas funktionieren? Ist meine Syntax überhaupt richtig? Die Beschreibungen zu den Modulen sind so was kryptisch...
alex