xplayer2005
Goto Top

mit perl komplettes Verzeichniss löschen (auch wenn noch dateien drin sind) unter xp

hallo,

gibt es einen perl Befehl um verzeichnisse komplett inc. untervereichnissen zu löschen.

nenn nein: wie kann ich das umsetzen?

bedanke mich im vorraus

Content-ID: 43895

Url: https://administrator.de/contentid/43895

Ausgedruckt am: 23.11.2024 um 20:11 Uhr

6890
6890 07.11.2006 um 19:25:08 Uhr
Goto Top
ja hallo,

dafür gibt es das modul File::Remove, kannste dir ja mal anschauen:
http://search.cpan.org/~adamk/File-Remove-0.34/lib/File/Remove.pm

mfg godlike P
6890
6890 07.11.2006 um 19:35:14 Uhr
Goto Top
falls du dir keine module installieren kannst, so funktionierts auch face-smile :
#!/usr/local/bin/perl

use strict;

my $dir="test";  
opendir(DIR,$dir)or die "$!";  
my @remove = readdir(DIR);
close(DIR);
foreach(@remove){
unlink("$dir/$_");  
}
rmdir($dir) or die $!;

mfg godlike P
Biber
Biber 07.11.2006 um 19:38:00 Uhr
Goto Top
@Godlike
Das gefällt mir... nicht so langatmig wie Batch... face-wink

5 Stars mit auf den Weg.

Gruß
Biber
6890
6890 07.11.2006 um 20:07:19 Uhr
Goto Top
@Godlike
Das gefällt mir... nicht so langatmig
wie Batch... face-wink

5 Stars mit auf den Weg.

Gruß
Biber

danke danke...
dafür kann ich leider gar kein batch face-sad
wir könn ja mal so wechselseitiges training machen batch <==> perl face-wink

mfg
xplayer2005
xplayer2005 08.11.2006 um 09:57:12 Uhr
Goto Top
ich bekomm da die meldung...

Permission denied at C:/Documents and Settings/d048045/My Documents/_eclipseWorkspace/test2/225.pl line 15.


line15: rmdir($delpath) or die $!;


sorry hab vergessen zu sagen: ich wil das skript auf xp unde server 2003 ausführen..
6890
6890 08.11.2006 um 15:27:38 Uhr
Goto Top
ich bekomm da die meldung...

Permission denied at C:/Documents and
Settings/d048045/My
Documents/_eclipseWorkspace/test2/225.pl line
15.

als welcher benutzer führst du das script aus??
denn das heisst das dir das löschen mangels rechten verwehrt wurde!!

mfg godlike P
6890
6890 09.11.2006 um 20:56:11 Uhr
Goto Top
abend,

hab mal ein script geschrieben welches
ordner für ordner durchgeht und alte
dateien und ordner löscht, kommentiert
ist es auch:
#!c:/perl/bin/perl

# das sind module für strictes programmieren und warnungen
use strict;
use warnings;

# ein paar konstanten
use constant LOESCHEN => 0;
use constant BEHALTEN => 1;
use constant DELETED => -1;

# dein ordner wo drinne gelöscht werden soll
my $dir = "D:/SCRIPTE/ADMINISTRATOR/test1";  

# das log file
my $logFile = "$dir/log.txt";  
my @allFiles;
my %allFiles;
my $lastMod;

# zeitpunkt minus 5 tage also alt die dateien und ordner höchstens sein dürfen
my $back5days = (time()-(86400*5));

# hier springt er in die sub cd
&cd($dir);

# alle dateien durchgehen und schauen ob sie älter als 5 tage sind
# ordner werden automatisch auf löschen gesetzt
foreach(@allFiles) {
    $lastMod = (stat($_))[9];
    $allFiles{$_} = BEHALTEN if(($lastMod - $back5days) > 0 && -f $_);
    $allFiles{$_} = LOESCHEN if(($lastMod - $back5days) < 0 && -f $_);
    $allFiles{$_} = LOESCHEN if -d $_;
}

# die dateien löschen die älter als 5 tage sind
foreach(keys(%allFiles)) {
    if ($allFiles{$_} == LOESCHEN && -f $_) {
        $allFiles{$_} = DELETED if unlink($_);
    }
}

# die ordner löschen die leer sind
# rmdir löscht nur leere ordner
foreach(keys(%allFiles)) {
    if ($allFiles{$_} == LOESCHEN && -d $_) {
        $allFiles{$_} = DELETED if rmdir($_);
    }
}

# den ganzen spass in ne log datei schreiben
&loggen();

# logdatei schreiben
sub loggen {
    open(LOGFILE,">$logFile") or die $!;  
    foreach(keys(%allFiles)) {
        print LOGFILE $_," --> ";  
        print LOGFILE "File/Directory wurde geloescht...\n\n" if $allFiles{$_} == DELETED;  
        print LOGFILE "File/Directory ist aktuell...\n\n" if $allFiles{$_} == BEHALTEN;  
        print LOGFILE "File/Directory wurde nicht geloescht...\n\n" if $allFiles{$_} == LOESCHEN;  
    }
    close(LOGFILE);
}

# diese recursive funktion geht in jeden ordner liest den inhalt aus und
# falls im inhalt ein ordner ist geht er auch in diesen und soweiter (recursiv halt)
# alle pfade von dateien und ordnern werden in ein array geschrieben damit
# man sie später löschen oder behalten kann
sub cd {
    my $dir = shift;
    my $base = $dir."/";  
    my @currDir;
    opendir(DIR,$dir) or die $!;
    @currDir=readdir(DIR);
    close(DIR);
    foreach(@currDir) {
        next if $_ eq '.' or $_ eq '..';  
        &cd($base.$_) if(-d $base.$_);
        push(@allFiles,$base.$_);
    }
}

falls fragen sind bitte melden
mfg godlike P
xplayer2005
xplayer2005 14.11.2006 um 11:10:03 Uhr
Goto Top
Danke bis hier her..

allerdings löcht es manchmal nicht alle Unterordner - ab und an bleiben welche stehn.. ich weis aber nicht wiso


hinweis falls jemand das script auch verwenden möchte:

Damit die Logfile funnktioniert muss hier ein > dazu - damit alles angehängt werde kannn

open(LOGFILE,">>$logFile") or die $!;