Thread Verzeichnisstrukturen älter als 30 Tage verschieben in ein Backup verschieben (25 answers)
Opened by nastja at 2010-04-15 15:57

topeg
 2010-04-16 01:29
#136156 #136156
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich habe das jetzt nicht getestet
Aber ich denke es sollte funktionieren

Code (perl): (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
132
133
134
135
136
137
138
139
140
#!/usr/local/bin/perl
use strict;
use warnings;

use File::stat;
use File::Find;
use File::Copy;
use File::Spec;

my $dir ='C:/Users/cthdev34/Desktop/map';
my $bakupdir = 'C:/Users/cthdev34/Desktop/map/bakup';

my $logFile = "$dir/Liste.txt";
my $inum_Tage = 30;


my @sortFiles; #Elemente älter als 30 Tage
my @dirs; #alle Ordner
my @fils; #alle Dateien
find(\&sort,$dir);
sub sort {
  my $file = $File::Find::name;
  my $file_rel=File::Spec->abs2rel($file,$dir);
  push(@dirs,$file) if (-d $file);
  push(@fils, $file) if (-f $file);
  push(@sortFiles,$file_rel) if ( -M $file  > $inum_Tage);
}

print "Ordner:   $_\n" for(@dirs);
print "Datei:    $_\n" for(@fils);
print "Sortiert: $_\n" for(@sortFiles);

# immer daran denken parameter an Funktionen zu übergeben
# und keine globalen variablen zu nutzen
#                                   anonymes ARRAY 
#                                  /             \
write_log($logFile,$dir,$bakupdir,[sort @sortFiles]);

# hier werden die Dateien verschoben
for my $file (sort @sort_files)
{
  move_file($file,$dir,$bakupdir);
}

# immer schön die Funktionen abtrennen 
# und dahinter keinen Code mehr schreiben
# das wird sonst zu unbübersichtlich
###############################################################################
# FUNKTIONEN ##################################################################
###############################################################################

#LOGDATEI
#******************************************************************************
sub write_log{
  my $file=shift;
  my $src=shift;
  my $dst=shift;
  my @list=@{shift(@_)}; #<=ARRAY-Referenz (das anonyme Array von oben)

  # so ist es noch ein bisschen besser
  # immer die drei parametige Form nutzen
  open(my $logf,'>',$file) or die $!;
  print $logf "*****************************************************\n\n";
  for my $file (@liste)
  {
    my $src_file=File::Spec->rel2abs($file,$src);
    my $stat = stat($src_file);
    # man muss nicht immer alles in eine Zeile quetschen
    # kann man so doch besser lesen
    print $logf "$src_file \n\n";
    print $logf "              Größe:", format_size($st->size)
    print $logf "     Änderungsdatum:", format_time($st->mtime)
    print $logf "\n\n\n";
  }
  close($logf);
}

sub format_time {
  my $time = shift;
  return $time if $time !~ /^\d+$/;
  my (undef,$min,$hour,$mday,$mon,$year) = localtime($time);
  return sprintf "%02d.%02d.%04d %02d:%02d", $mday,$mon+1,$year+1900,$hour,$min;
}

sub format_size {
  my $size = shift;
  return $size if $size !~ /^\d+$/;
  my @list=qw(Kb Mb Gb Tb);
  my $suffix = 'Byte';

  # mit while bist du hier besser dran. 
  # da kannst du leichter prüfen ob bestimmte beinungen erfüllt sind
  # man sollte auch prüfen ob man überhaupt noch eine größere Darstellung hat
  while($size>1024 && @list)
  {
    $suffix=shift(@list);
    $size /= 1024;
  }

  my $format = ($suffix eq 'B' ? "%d " : "%.2f ").$suffix;
  return sprintf $format, $size;
}


#STRUKTUR VON DIREKTORYS ERZEUGEN
#*****************************************************************************

sub move_file
{
  my ($file, $src, $dst) = @_;
  # da beim lesen gleich relative Pfade erzeugt wurden,
  # ist es leicht die nötigen Pfade zum kopieren zu erzeugen
  my $dst_file=File::Spec->rel2abs($file,$dst);
  my $src_file=File::Spec->rel2abs($file,$src);
  
  # wir brauchen nur Laufwerk und Ordner
  # um bei bedarf die nötigen Verzeichnisse zu erstellen
  my ($volume,$directories,$file) = File::Spec->splitpath( $dst_file );
  make_dirs(File::Spec->catpath($volume, $directories));

  # verschieben der Datei
  move($src_file,$dst_file);

  return 1;
}

# Erzeugen von Verzeichnissen wenn sie nicht existieren
sub make_dirs
{
  my $path=shift;

  my $dnow='';
  ($dnow,$path)=File::Spec->splitpath($path, 1);
  for(File::Spec->splitdir($path))
  {
    $dnow=File::Spec->join($dnow, $_);
    unless(-d $dnow)
    { mkdir($dnow) or die("ERROR mkdir: $dnow ($!)"); }
  }
}

View full thread Verzeichnisstrukturen älter als 30 Tage verschieben in ein Backup verschieben