Leser: 21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
foreach (@allFiles){
Move($_,$bakupdir);
}
#STRUKTUR VON DIREKTORYS ERZEUGEN
#*********************************************
sub Move {
my ($dir_file, $bakup) = @_;
my @dirs = split '/', $dir_file;
my $file = pop @dirs;
foreach (@dirs) {
next if -d $bakup;
mkdir($bakup) or print("Can't create dir $bakup: $!"),return undef;
}
rename($dir_file, "$bakup/$file") or
print("Can't move $dir_file to $bakup: $!"),return undef;
return 1;
}
2010-04-15T15:02:18 nastjawas ist mit der Funktion Move????
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
#!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 @sortFiles; #Elemente älter als 30 Tage my @dirs; #alle Ordner my @fils; #alle Dateien my $st; my $logFile = "$srcDir/Liste.txt"; my $inum_Tage = 30; #&cd($dir); find(\&sort,$srcDir); foreach(@dirs){print "Ordner:",$_,"\n";} foreach(@fils){print "Datei:",$_,"\n";} foreach(@sortFiles){print "Sortiert:", $_,"\n";} #ALLE ORDNER #****************************************************************************** sub sort { my $file = $File::Find::name; push(@dirs,$file) if (-d $file); push(@fils, $file) if (-f $file); push(@sortFiles,$file) if ( -M $file > $inum_Tage); } #ich glaube es liegt an dieser Zeile...... ich habe versucht es so zu machen.....ist leider falsch, wenn ich es komplett raushole, passiert gar nichts... #@sortFiles = find(\&sort(File::Spec->rel2abs($srcDir)); # die dateien loeschen die aelter als 30 tage sind for (sort(@sortFiles)) { # für die Quelle aus dem relaiven einen absoluten Pfad machen my $srcName=File::Spec->rel2abs($_, $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($_, $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 foreach( sort(@sortFiles)) { if ( -d $_) { my $DirName=File::Spec->rel2abs($_, $srcDir); 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 ($!)"); } } }
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 ($!)"); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
use strict; use warnings; use File::Spec; dir('.'); sub dir { my $p = shift; if(my $dir = opendir $p)) { while(my $f = readdir $dir)) { next if $f =~ /^\.?\./; my $path = File::Spec->catfile( $p, $f ); print "$path\n"; dir($path) if -d $path; } closedir $dir; } }
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
#!/usr/local/bin/perl use strict; use File::stat; use File::Find; use File::Copy; my $dir ='C:/Users/cthdev34/Desktop/map'; my $bakupdir = 'C:/Users/cthdev34/Desktop/map/bakup'; my @sortFiles; #Elemente älter als 30 Tage my @dirs; #alle Ordner my @fils; #alle Dateien my $st; my $logFile = "$dir/Liste.txt"; my $inum_Tage = 30; #&cd($dir); find(\&sort,$dir); foreach(@dirs){print "Ordner:",$_,"\n";} foreach(@fils){print "Datei:",$_,"\n";} foreach(@sortFiles){print "Sortiert:", $_,"\n";} find(\&liste,$dir); #ALLE ORDNER #****************************************************************************** sub sort { my $file = $File::Find::name; push(@dirs,$file) if (-d $file); push(@fils, $file) if (-f $file); push(@sortFiles,$file) if ( -M $file > $inum_Tage); } #ELEMENTE ÄLTER ALS X TAGE #****************************************************************************** # sub sortierung { # my $file = $File::Find::name; # push(@allFiles,$file) if ( -M $file > $inum_Tage); #} #LOGDATEI #****************************************************************************** sub liste{ open(LOGFILE,">$logFile") or die $!; print LOGFILE "\t\t\t$dir\n"; print LOGFILE "\t\t*****************************************************\n\n"; foreach(@sortFiles){ foreach(@dirs){print LOGFILE "Ordner:",$_,"\n"; } #??????????? $st = stat($_); print LOGFILE "$_ \n\n \t\t\tGröße:",printable_size($st->size),"\t", "Änderungsdatum:",printable_time($st->mtime),"\n\n\n"; } close(LOGFILE); } sub printable_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 printable_size { my $size = shift; return $size if $size !~ /^\d+$/; my $suffix = 'B'; foreach (qw(KB MB GB)) { last if $size < 1000; $size /= 1024; $suffix = $_; } my $format = ($suffix eq 'B' ? "%d " : "%.2f ").$suffix; return sprintf $format, $size; } foreach (@sortFiles){ Move($_,$bakupdir); } #foreach (@all){ #rmdir $_ if (-d $_); #} #STRUKTUR VON DIREKTORYS ERZEUGEN #***************************************************************************** sub Move { my ($dir_file, $bakup) = @_; my @dirs = split '/', $dir_file; my $file = pop @dirs; foreach (@dirs) { next if -d $bakup; mkdir($bakup) or print("Can't create dir $bakup: $!"),return undef; } rename($dir_file, "$bakup/$file") or print("Can't move $dir_file to $bakup: $!"),return undef; return 1; }
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 ($!)"); } } }