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-15 18:58
#136126 #136126
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Du musst auch die absoluten Pfade in relative umwandeln
Ansonsten kannst du keine Daten von Quelle zum passenden Ziel verschieben
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
#!c:/perl/bin/perl -w

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

# dein ordner wo drinne geloescht werden soll

my $srcDir ='C:/Users/cthdev34/Desktop/map';
my $destDir = 'C:/Users/cthdev34/Desktop/map/bakup';
my $oldInDays=30;

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


my @sortFiles; #Elemente älter als 30 Tage
my @dirs; #alle Ordner
my @fils; #alle Dateien
find(\&found,$srcDir);
sub found {
  my $file = $File::Find::name;
  # Du brauschst die relativen Pfade:
  my $file_relative=File::Spec->abs2rel($file, $srcDir);
  push(@dirs,$file) if (-d $file);
  push(@fils, $file) if (-f $file);
  push(@sortFiles,$file_relative) if ( -M $file  > $inum_Tage);
}

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

# die dateien loeschen die aelter als 30 tage sind

for my $file (sort(@sortFiles))
{
  # für die Quelle aus dem relaiven einen absoluten Pfad machen
  my $srcName=File::Spec->rel2abs($file, $srcDir);
  # ist es eine Datei und soll gelöscht werden?
  if ( -f $srcName)
  {
    # für das Ziel aus dem relaiven einen absoluten Pfad machen
    my $destName=File::Spec->rel2abs($file, $destDir);

    # nötige Verzeichnisse am Ziel erstellen wenn es nötig ist.
    my ($volume,$directories,$file) = File::Spec->splitpath( $destName );
    make_dirs(File::Spec->catpath($volume, $directories));

    # Datei verschieben
     move($srcName,$destName);
  }
}

# die ordner loeschen die leer sind
# rmdir loescht nur leere ordner

# EDIT:
# hier hatte sich noch ein Fehler versteckt
foreach( sort(@sortFiles))
{
  my $DirName=File::Spec->rel2abs($_, $srcDir);
  if ( -d $DirName)
  {
    rmdir($DirName);
  }
}

########################################################################

# 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 ($!)"); }
  }
}


Edit: Fehler im Code Zeile 61ff.
Last edited: 2010-04-15 21:28:10 +0200 (CEST)

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