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

Gast nethawk
 2010-03-12 14:22
#134583 #134583
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
Code: (dl )
use File::Copy;
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:
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
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.$_);

}
}

View full thread code erweitern