Re: [OT] Mittelschweres Perl-Problem (was Re: Mittelschweres Perl-Problem)
Hallo David, David Haller <david@dhaller.de> wrote ..
*Urgsl*
Ja, ich bin kein Perl-Debugger ;-)
Du willst dir 'perldoc File::Find' anschauen.
Gute Idee :-) Danke für den Tipp. Hier ist erstmal meine Anpassung an der ich weiterwursteln werde. <cut here><cut here><cut here><cut here><cut here><cut here><cut here> #!/usr/bin/perl -w use strict; use warnings; use File::Find; my $dirtoget="/home/macmewes/webadmin-trans/webmin"; # Hier stimmt was nicht. Die Dateien config-* werden nicht gelöscht. my @dont_touch_files = (".*config\..*",".*module\..*"); # Hier stimmt was nicht. Die Verzeichnisse bleiben zwar unberührt, aber die # Dateien darin werden gelöscht. Das soll ja nicht so. my @dont_touch_dirs = ("lang","ulang","help"); my $skipfiles = join("|", @dont_touch_files); my $skipdirs = join("|", @dont_touch_dirs, '^\.$', '^\.\.$'); print "$skipfiles\n"; print "$skipdirs\n"; finddepth(\&wanted, $dirtoget); sub wanted { if(-d $_ && /^(?:$skipdirs)$/ ) { print "skipping dir '$File::Find::name'\n"; } elsif( -f $_ && /^(?:$skipfiles)$/ ) { print "skipping file '$File::Find::name'\n"; } elsif( -d $_) { print "deleting directory '$File::Find::name'\n"; #rmdir($_); } else { print "deleting file '$File::Find::name'\n"; #unlink($_); } } <cut here><cut here><cut here><cut here><cut here><cut here><cut here> bis dahin / kind regards Martin -- http://webmin.mamemu.de/ WebMin-Mirror Official Webmin/Usermin Translation Co-Ordinator 2003/2004 http://www.webmin.com/mailing-trans.html
Hallo, Am Thu, 27 May 2004, Martin Mewes schrieb:
David Haller <david@dhaller.de> wrote ..
Du willst dir 'perldoc File::Find' anschauen. # Hier stimmt was nicht. Die Dateien config-* werden nicht gelöscht. my @dont_touch_files = (".*config\..*",".*module\..*"); ^^ hier wird explizit ein Punkt gefordert. ==> ".*config.*" Oder verwende ".*config[.-].*" falls du config und dann Punkt oder Bindestrich haben willst.
# Hier stimmt was nicht. Die Verzeichnisse bleiben zwar unberührt, aber die # Dateien darin werden gelöscht. Das soll ja nicht so. my @dont_touch_dirs = ("lang","ulang","help");
Ok. Achtung: UNGETESTET! [..] sub wanted { if(-d $_ && $File::Find::name =~ /^$dirtoget\/(?:$skipdirs)/ ) { # $_ enthaelt nur den Dateinamen und $File::Find::name den kompletten # relativen Pfad der Datei. Da du mit einem absoluten Pfad suchen # willst, musst du auch den absoluten Pfad verwenden um die zu # ueberspringenden Verzeichnisse zu treffen. Daher das $dirtoget. print "skipping dir '$File::Find::name'\n"; } elsif( -f $_ && /^(?:$skipfiles)$/ || -f $_ && $File::Find::name =~ /^$dirtoget\/(?:$skipdirs)\//) { print "skipping file '$File::Find::name'\n"; } elsif( -d $_) { } finddepth(\&wanted, $dirtoget); [..] Wie gesagt, ungetestet (und ich bin muede)... HTH, -dnh -- If you haven't got time to RTFM, you haven't got time to whine on this mailing list.
Hallo David, Am Donnerstag, 27. Mai 2004 23:08 schrieb David Haller:
Ok. Achtung: UNGETESTET!
<stammel> Der Fehler lag da wohl bei mir </stammel> Ich habe &wanted() in einem anderen Kontext aufgerufen und dabei hat sich $dirtoget in $newdir verwandelt ;-) <schulligung> Dein nachträglicher Hack hat geholfen, vielen Dank, dennoch ... my @dont_touch_files = (".*config\.*",".*module\.*"); in Verbindung mit sub wanted { if(-d $_ && $File::Find::name =~ /^$newdir\/(?:$skipdirs)/ ) { print "skipping dir '$File::Find::name'\n"; } elsif( -f $_ && /^(?:$skipfiles)$/ || -f $_ && $File::Find::name =~ /^$newdir\/(?:$skipdirs)\//) { print "skipping file '$File::Find::name'\n"; } elsif( -d $_) { print "deleting directory '$File::Find::name'\n"; rmdir($_); } else { print "deleting file '$File::Find::name'\n"; unlink($_); }; }; ergibt ... $ ls acl/config* (Auszug) acl/config sollte gelöscht sein acl/config-macos-1.6 sollte gelöscht sein acl/config-freebsd sollte gelöscht sein acl/config-*-linux sollte gelöscht sein acl/config-netbsd sollte gelöscht sein acl/config-macos-1.3 sollte gelöscht sein acl/config-openbsd sollte gelöscht sein acl/config-macos-1.4 sollte gelöscht sein acl/config-macos-1.5 sollte gelöscht sein my @dont_touch_files = (".*config\..*",".*module\..*"); löscht zumindest die verbliebenen "config"'s aus den Verzeichnissen. my @dont_touch_files = (".*config\.info\..*",".*module\.info\..*"); erzeugt das richtige Ergebnis :-) Danke nochmals Martin -- Debian GNU/Linux http://www.debian.org/ SuSE Linux http://www.suse.de/ RedHat Linux http://www.redhat.com/ Fedora Project http://www.fedora.us/
participants (2)
-
David Haller
-
Martin Mewes