Thread code erweitern (10 answers)
Opened by nethawk at 2010-03-12 14:22

Gast nethawk
 2010-03-12 22:12
#134645 #134645
hi esskar,

so hab ich es versucht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!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.$_);
}
}

View full thread code erweitern