[GastForen Archiv Perl und CGI Brauche hilfe bei einem Proggi

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Archiv - Archivierte Foren
Themen
Beiträge
Moderatoren
Letzter Beitrag

Brauche hilfe bei einem Proggi

Anonym
Beiträge gesamt: 22827

6. Jul 2004, 13:36
Beitrag # 1 von 2
Bewertung:
(1304 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Also, mein Problem ist folgendes:
ich brauche ein Programm, das zwei Ordner abgleicht.

Hierzu soll vom Inhalt beider Ordner eine Textdatei erstellt werden, diese verglichen und fehlende Dateien kopiert werden.

Hat jemand eine Idee wie das klappen könnte?
X

Brauche hilfe bei einem Proggi

mättu
Beiträge gesamt: 11

3. Nov 2004, 16:21
Beitrag # 2 von 2
Beitrag ID: #120993
Bewertung:
(1304 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Du könntest es mit diesen zwei Files probieren. Das erste ist eine Textdatei, die pfade.txt heisst und im selben Dir gespreichert wird, wie das backup.pl weiter unten.
Achtung! Es bearbeitet rekursiv alle darunterliegenden Directories.
Wahrscheinlich ist es viel zu aufwändig, aber du kannst es vereinfachen, wie du willst.
Das Perl ist nicht immer sehr stylish, aber es läuft ziemlich gut.

pfade.txt
#Daten für backup.pl

"meldungslevel" -> "2"
"c:/gaga/bla/" -> "c:/gaga/neu"

#Anleitung:

#Allgemein:
#Immer in der Form: "xyz" -> "abc"

#Meldungslevel:

#in der ersten Zeile (am besten, eigentlich egal wo...) steht der Meldungslevel. Hier seine Benutzung
#lustige kleine Idee: (meistens wird man meldungslevel 2 oder 3 benützen)
#meldungslevel 0: überhaupt keine angaben. Wir verlassen uns darauf, dass alles funktioniert.
#meldungslevel 1: nur fehler werden angezeigt
#meldungslevel 2: nur geschriebene Dateien und Fehler werden angezeigt
#meldungslevel 3: zusätzlich werden im backup neu angelegte Dir's angezeigt
#meldungslevel 4: es wird aber auch alles angezeigt. Also: Dir-wechsel, schreibvorgänge, Fehler usw.

#Directories:

#überleg dir gut, was du da einträgst, das kann in die Zeit und die GB gehen :-)
#Es werden rekursiv alle unter-dirs gebackupt.
#Form: "c:/blabla/" -> "e:/blabla/"
#Am schönsten ist es mit slash und schluss-slash. Es ist aber nicht nötig. Das Programm fängt viel ab:
#backslashes werden verwandelt, Leerzeichen am Anfang und am Ende werden abghängt, Schlussslashes ergänzt.
#Möglich ist also so etwas: "c:\blabla/xy\" -> "e:/blabla\xy "
#Man kann praktisch beliebig viele Directories eintragen.
#unter Win spielt es auch keine Rolle, ob die Laufwerke gross oder klein geschrieben werden…

#Process timeout
#wenn du backup.pl über einen Webserver laufen lässt, kann es schnell vorkommen, dass du eine Prozess-Zeitüberschreitung bekommst.
#Entweder setzt du nun das timeout im server herauf (wenn du kannst und darfst)
#Oder du startest das backup.pl von der Kommandozeile aus.
#Dann solltest du allerdings das Meldungslevel auf höchstens 3 schalten. (Am besten 1)

#Viel Spass:-)


backup.pl:

#!/usr/bin/perl
use CGI::Carp ('fatalsToBrowser'); #nur zum Testen im Browser..
use File::Copy;
#*****************Hauptprogramm***************
pfadelesen();
print "Meldungslevel = $meldungslevel\n\n" if ($meldungslevel >=2);
print "Start rekursives Backup von:\n";
$|=1; #pufferung der print-ausgaben ausschalten
$e=0;
foreach $lesepfad (@lesepfade)
{
$schreibpfad = $schreibpfade[$e];
print "\n$lesepfad->$schreibpfad\n\n" if ($meldungslevel >=2);
chdir "$schreibpfad" or $leidernein=1;
if ($leidernein == 1)
{
print "Die externe Harddisk scheint nicht bereit zu sein. Wir brechen ab.\n";
last;
}
chdir "$lesepfad";
dircheck();
suchen();
$e++;
}
print "\nfertig. Bitte Resultat kontrollieren und Ferien machen:-)\n\nBeliebige Taste druecken (ev auch den any-key), um das Fenster zu schliessen.";
$i = <STDIN>;
#****************Hauptprogramm fertig***********

sub suchen
{
my @files = glob "*"; #dieser array ist lokal gemacht hiermit, damit er sich nicht bei der rekursion überschreibt.
foreach $lesedatei (@files)
{
if (-f $lesedatei ){kopieren();}
else #wenn wir also einen ordner gefunden haben:
{
$schreibpfad .= $lesedatei."/";
chdir "$lesedatei/" or die("versuchen vergeblich nach $pfad zu wechseln"); #in den Ordner wechseln und...
dircheck();
suchen(); #...sich selbst aufrufen.
do {$schreibpfad =~ s/.$//} until ($schreibpfad =~ m/\/$/); #solange 1 zeichen bis wieder / kommt weg.
chdir ("../") or die ("Ordner zurücksetzen in $pfad fehlgeschlagen");
}
}
}

sub dircheck
{
if (!(-e "$schreibpfad"))
{
mkdir ($schreibpfad) or $leidernein = 1;
if ($leidernein == 1)
{
@pisse = split (/\//, $schreibpfad); #auch hier wieder: es geht so, aber...
print $schreibpfad;
chdir ("$pisse[0]"); #es geht schön der Reihe nach, weil es nicht auf's Mal ein doppeltes unterdir machen kann. (warum eigentlich, fragt man sich)
$menge = @pisse;
foreach $e (0.. $menge-1)
{
mkdir $pisse[$e];
chdir $pisse[$e];
print "wir schreiben gerade neu: $pisse[$e]\n" if ($meldungslevel >=4);
}
}
}
else {print "tiptop: $schreibpfad existiert bereits!\n" if ($meldungslevel >=4);}
}


sub kopieren
{
$lesedateizeit = (stat ($lesedatei))[9];#Zeit der letzten Änderung abfragen.
$schreibdatei = "$schreibpfad$lesedatei";
$schreibdateizeit = (stat ($schreibdatei))[9];
if ((-e "$schreibdatei") && ($lesedateizeit <= $schreibdateizeit))
{
print "$schreibdatei existiert und ist aktuell | wir brauchen nix zu kopieren" if ($meldungslevel >=4);
}
else
{
if (-e $schreibdatei){print " $lesedatei ist älter als das Original |" if ($meldungslevel >=4);}
else {print " $lesedatei gibt es noch nicht. Wir kopieren | $lesedatei -> " if ($meldungslevel >=4);}
$meldung = copy ($lesedatei, $schreibdatei);
if ($meldung == 1){print "$schreibdatei\n" if ($meldungslevel >=2);}
else {print "Fehler!! $schreibdatei (leider...)\n" if ($meldungslevel >=1);}
}
}

sub pfadelesen
{
open (PFADE, "pfade.txt");
$e =0;
while ($text=<PFADE>)
{
chomp ($text);
if (($text) &&(!($text =~ m/^#/))) #nur wenn auf der Linie was ist und nicht auskommentiert ist...
{
($lesepfade[$e] , $schreibpfade[$e]) = split (/->/,$text);
$lesepfade[$e] =~ s/"//g; #Was jetzt kommt ist für die Gemütlichkeit... Alle " weg
$schreibpfade[$e] =~ s/"//g;
$schreibpfade[$e] =~ s/#.*//; #ein allfälliger Kommentar (# xyz) am Ende kommt weg. Wir nehmen an, dass im vorderen Teil keine Kommentare sind..
$lesepfade[$e] =~ s/\s+$//g; #alle whitespaces am ende weg
$schreibpfade[$e] =~ s/\s+$//g;
$lesepfade[$e] =~ s/^\s+//g; #und alle whitespaces am anfang auch weg...
$schreibpfade[$e] =~ s/^\s+//g;
$lesepfade[$e] =~ s/\\/\//g; #alle \ in /
$schreibpfade[$e] =~ s/\\/\//g;
if ($lesepfade[$e] =~m/meldungslevel/) #wenn die Meldungslevel-zeile kommt, schreiben wir die sache in die Variable und nicht in den Pfad...
{
$meldungslevel = $schreibpfade[$e];
}
else
{
$lesepfade[$e] .= "/" if (! ($lesepfade[$e]=~ m/\/$/)); #schluss-slash dazu wenn keiner da.
$schreibpfade[$e] .= "/" if (! ($schreibpfade[$e]=~ m/\/$/));
$e++;
}
}
}
close PFADE;
}


als Antwort auf: [#95251]

Aktuell

InDesign / Illustrator

| 23.05.2022

IDUG_300

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
02.02.2023

Prozesse optimieren und effizient gestalten

Zürich
Donnerstag, 02. Feb. 2023, 08.00 - 10.00 Uhr

Digitalisierung, Webauftritt

Digitalisierung mitgestalten - Worauf kommt es an? Wie wichtig ist die Webseite? Webseite mit Word Press? Interne Prozesse optimieren

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: Birol Isik, E-Mailinfo AT bkcc DOT ch

https://digitalisierung-heute.ch/digitalisierung-informationstag-schweiz/

Veranstaltungen
01.03.2023 - 09.03.2023

Online
Mittwoch, 01. März 2023, 00.00 Uhr - Donnerstag, 09. März 2023, 00.00 Uhr

Online Webinar

Wie gehen wir mit diesen Veränderungen um? Was ist notwendig, damit wir die Digitalisierung im Unternehmen klappt? Veränderungsprozesse verstehen und entsprechend handeln Mitarbeiter als Botschafter Webseite mit WordPress erstellen SEA /SEO (Ads aufschalten)

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: B. Isik, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/digitalisierung-schweiz/