<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Hallo Hans-Dietrich,</div><div class=""><br class=""></div><div class="">da war noch ein Fehler drin - die Zeile</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><font color="#000000" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">next if($ent =~ m/^\.|\.\.$/);</span></font></blockquote><br class=""></div><div class="">müsste in</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><font color="#000000" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">next if($ent =~ m/^(?:\.|\.\.)$/);</span></font></blockquote></div><div class=""><br class=""></div><div class="">geändert werden. Sorry dafür.</div><div class=""><br class=""></div><div class="">Viele Grüße,</div><div class="">Martin</div><div class=""><br class="">--<div class="">Via Motorola International 3200</div></div><div class=""><br class="">On 09.12.2014, at 23:15, Hans-Dietrich Kirmse <<a href="mailto:hd.kirmse@gmx.de" class="">hd.kirmse@gmx.de</a>> wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><span class="">Hallo Martin,</span><br class=""><span class=""></span><br class=""><span class="">danke für deine Antwort.</span><br class=""><span class=""></span><br class=""><span class="">Am 09.12.2014 um 22:36 schrieb Martin Probst:</span><br class=""><blockquote type="cite" class=""><span class="">Hallo Hans-Dietrich,</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">On 09 Dec 2014, at 07:29, Hans-Dietrich Kirmse <<a href="mailto:hd.kirmse@gmx.de" class="">hd.kirmse@gmx.de</a>> wrote:</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">Guten Morgen,</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">[...]</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">Leider kopiert dieses Script nur Dateien, aber keine Verzeichnisse.</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">Ich weiss zwar, dass es das Modul File::Copy::Recursive gibt, aber es müssen auch die Rechte gesetzt werden (das kann vielleicht auch noch entfallen), aber es muss auf jeden Fall der Owner geändert werden. Und wie man das mit Perl für einen Verzeichnis rekursiv macht, habe ich nicht gefunden. Auch wenn es hier vermutlich nicht gebraucht wird, bei den Rechten sollten ja eigentlich die für Dateien und Verzeichnisse unterschiedlich gesetzt werden. Auch das weiss ich nicht, wie man das machen könnte.</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">Zusammengefasst: es geht um das Ersetzen des 'TODO's in dem folgenden Abschnitt:</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""># wenn Datei</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">if (-f $quelldatei) {</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">  # dann kopieren (gegebenenfalls überschreiben)</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">  $okay = copy $quelldatei, $zieldatei;</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">  # wenn das Kopieren geklappt hat</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">  if ($okay) {</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">    # den Owner und Gruppe setzen</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">    chown $uid, $gid, $zieldatei;</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">    # die Rechte setzen</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">    chmod 0755, $zieldatei;</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">    # den Dateizähler um 1 erhöhen</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">    $anz_files++;</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">  }    </span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">}</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""># sonst (wenn Verzeichnis)</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">else {</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">  #</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">  # TODO  (analog für Verzeichnisse, aber eben rekursiv)</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">  #</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">}        </span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">Wäre für jeden Hinweis zu diesem Problem sehr dankbar.</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><span class="">PS: da ich als Laie und Autodidakt und zudem hier "im eigenen Saft schmore" würde ich mich auch über jeden Hinweis bzw. Kritik zu diesem Script unabhängig von diesem Kopierproblem freuen.</span><br class=""></blockquote></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Als erster Tipp, nutze für die einzelnen Aufgaben doch sub’s. Das macht das Script an sich übersichtlicher und besser lesbar.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Ich würde ähnlich wie du herangehen, also Verzeichniseinträge lesen, Test ob Verzeichnis oder Datei und dann kopieren.</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Ich würde dafür jedoch eine rekursive Funktion nutzen, die diese Aufgabe erledigt. Es sollte quasi immer, wenn die Quelle ein Verzeichnis ist, ein einlesen des Verzeichnis, Test ob Datei... usw. usf. stattfinden.</span><br class=""></blockquote><span class=""></span><br class=""><span class="">Hm, ich bin eigentlich Laie. In etwa 8 Jahren gehe ich in Rente, Perl habe ich mir vor ca. 10 Jahren autodidaktisch angeeignet, sicher mehr recht als schlecht. Da das Script für (andere) Lehrer zur Verfügung gestellt werden soll, die in der Schule die Server / Netze betreuen, meist unbezahlt und in ihrer Freizeit, wollte ich um eine stabile Lösung zu erstellen eigentlich auf getestete und bewährte Module zurückgreifen. Aber genau für diese m.E. üblichen Anforderungen habe ich kein Modul gefunden (kopieren alleine ist zu wenig)</span><br class=""><span class=""></span><br class=""><blockquote type="cite" class=""><span class="">Meine Q&D Lösung sieht daher in Perl so aus:</span><br class=""></blockquote><span class=""></span><br class=""><span class=""></span><br class=""><blockquote type="cite" class=""><span class="">#!/usr/bin/perl</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">use strict;</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">use warnings;</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">use File::Copy;</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">use v5.10;</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">my $src = $ARGV[0];</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">my $dst = $ARGV[1];</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">mycopy($src, $dst);</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">sub mycopy {</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">     my $s = shift;</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">     my $d = shift;</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">     if(-d $s) {</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         unless(-d "$d") {</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">             warn "$d is not a directory";</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">             return;</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         }</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         opendir(my $dh, $s) or die "Can't open dir $s: $!";</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         while(my $ent = readdir($dh)) {</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">             next if($ent =~ m/^\.|\.\.$/);</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">             if(-d "$s/$ent") {</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">                 mkdir("$d/$ent");</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">                 chown(1337, 42, "$d/$ent");</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">                 chmod(0755, "$d/$ent");</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">             }</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">             mycopy("$s/$ent", "$d/$ent");</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         }</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         closedir($dh);</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">     } else { # we assume that source must be a regular file</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         $d = "$d/$s" if(-d $d);</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         copy($s, $d);</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         chown(1337, 42, "$d");</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">         chmod(0644, "$d");</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">     }</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">}</span><br class=""></blockquote><span class=""></span><br class=""><span class="">Sowas hatte ich nach der Wende mal in Pascal programmiert. für mich ist das nicht Q&D, sondern genau das, was ich eigentlich nicht programmieren wollte ;) Wie schon angegeben, habe gedacht, es gibt sowas als Modul.</span><br class=""><span class=""></span><br class=""><blockquote type="cite" class=""><span class="">Aber mal anders gefragt, wenn du sowieso auf einem Linux-System bist, was spricht gegen ein Shell-Skript?</span><br class=""></blockquote><span class=""></span><br class=""><span class="">sehr viel: ich kann kein Shellscripting - nur ein paar Shellbefehle und die schlage ich erst nach ;) . Das bedeutet, ich erledige alle meine Aufgaben als "Hobby-Admin" bzw. bei der Mitarbeit in dem Schulserver-Projekt mit Perl.</span><br class=""><span class=""></span><br class=""><span class="">Danke nochmal für diese Lösung. Ich bin damit wunschlos glücklich und baue das in mein Script ein. Zudem wird die Lösung ja schlanker, weil ich den Fall der Datei jetzt canceln kann und nur noch 2 Fälle habe für das rekursive kopieren des (einen) Verzeichnisses - des Desktops.</span><br class=""><span class=""></span><br class=""><span class="">Viele Grüße</span><br class=""><span class="">Hans-Dietrich</span><br class=""><span class="">_______________________________________________</span><br class=""><span class="">Dresden-pm mailing list</span><br class=""><span class=""><a href="mailto:Dresden-pm@pm.org" class="">Dresden-pm@pm.org</a></span><br class=""><span class=""><a href="http://mail.pm.org/mailman/listinfo/dresden-pm" class="">http://mail.pm.org/mailman/listinfo/dresden-pm</a></span><br class=""></blockquote></body></html>