#!c:/perl/bin/perl -w
# das sind module für strictes programmieren und warnungen
use File::Copy;
use strict;
use warnings;
# ein paar konstanten
use constant LOESCHEN => 0;
use constant BEHALTEN => 1;
use constant DELETED => -1;
# dein ordner wo drinne geloescht werden soll
my $dir = "C:/test";
my $backup = "C:/backup";
# das log file
my $logFile = "$dir/log.txt";
my @allFiles;
my %allFiles;
my $lastMod;
# zeitpunkt minus 30 tage also alt die dateien und ordner hoechstens sein dürfen
my $backxdays = (time()-(86400*30));
# hier springt er in die sub cd
&cd($dir);
# alle dateien durchgehen und schauen ob sie aelter als 30 tage sind
# ordner werden automatisch auf loeschen gesetzt
foreach(@allFiles) {
$lastMod = (stat($_))[9];
$allFiles{$_} = BEHALTEN if(($lastMod - $backxdays) > 0 && -f $_);
$allFiles{$_} = LOESCHEN if(($lastMod - $backxdays) < 0 && -f $_);
$allFiles{$_} = LOESCHEN if -d $_;
}
# die dateien loeschen die aelter als 30 tage sind
foreach(keys(%allFiles))
{
if ($allFiles{$_} == LOESCHEN && -f $_)
{
$allFiles{$_} = copy($allFiles{$_},$backup) if unlink($_);
{
$allFiles{$_} = DELETED if unlink($_);
}
}
}
# die ordner loeschen die leer sind
# rmdir loescht 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.$_);
}
}