Mit diesem Perl-Script werden Dateien, die älter als 5 Tage sind gelöscht.
Meine Frage ist jetzt, wie kann ich den Script so erweitern, dass die Dateien die älter als 5 Tage sind vor dem Löschen in ein Backup-Verzeichnis kopiert werden. Habe es mit
versucht, bekomme es aber nicht hin. Ein Beispiel wie man es realisieren kann wäre super. Vielen Dank schon mal im voraus.
So, hier der Script:
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
127
128
129
130
131
#!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.$_);
}
}