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