#!/usr/bin/perl # Skript loescht saemtliche Dateien im Ordner, # den wir hier eingeben und wenn der Ordner leer ist # loescht es den leeren Ordner. # Symlinks und Unterordner werden nicht gelöscht use strict; use warnings; # macht das bearbeitzen von Pfaden unabhänig vom benutzen Betriebsystem use File::Spec; my $sammel_pfad = "/home/uli/logs"; my $log_datei ='loesch_logfile.txt'; my $log_pfad = File::Spec->join($sammel_pfad, $log_datei); my $ordner=''; # Abfrage des Ordners und # Sicherheitsabfragen while(!$ordner) { print "In welchen Ordner soll ich alle Dateien loeschen?\n"; $ordner = ; chomp $ordner; if(-d $ordner) { print "Danke soll ich dann wirklich alle Dateien in $ordner loeschen? [j/N]\n"; my $entscheidung = ; chomp($entscheidung); # wenn keine Eingabe dann ist 'n' gemeint! $entscheidung='n' unless($entscheidung); if(lc($entscheidung) eq 'j') { print "#\n#ALLE Dateien in $ordner werden gelöscht\n#\n"; } else { print "#\n#Breche das Programm ab \n#\n"; #exit mit errorcode 1 exit(1); } } else { print "Ordner $ordner existiert nicht oder ist eine Datei\n"; print "Erneute Eingabe? [J/n]\n"; my $entscheidung = ; chomp($entscheidung); # wenn keine Eingabe, dann ist 'j' gemeint! $entscheidung='j' unless($entscheidung); unless(lc($entscheidung) eq 'j') { print "#\n#Breche das Programm ab \n#\n"; #exit mit errorcode 2 exit(2); } } } open(my $logfh, '>', $log_pfad) or die "Kann LOG_Datei $log_datei nicht oeffnen: $!\n"; print "#\n#\n# Schreibe ab jetzt in Log Datei $log_datei !\n#\n#\n"; loesche($logfh, $ordner); close $logfh; ######################################################################### ######################################################################### # Funktion loescht nacheinander mittels foreach Schleife datei fuer datei im Ordner # übergebene Parameter # - loging filehandle # - Pfad zum Ordner sub loesche { # Funktion loesche wird mit Argument $ordner my $log=shift; my $dir=shift; print $log "START\n"; print $log "#\n#\n#\n"; print $log "Bearbeite $dir\n"; opendir(my $dfh, $dir) or die "error open $dir $!"; my @remove = readdir($dfh); closedir($dfh); for my $datei (@remove) { # virtuelle Ordner . und .. überspringen next if ($datei eq '.' or $datei eq '..'); my $pfad=File::Spec->join($dir,$datei); if (-l $pfad) { print "Habe einen Link $datei gefunden loesche diesen nicht\n"; next; # überspinge rest der schleife überspringen } # Die datei ist wirklich eine Datei if(-f $pfad) { # unlink löscht dateien im Ordner if(unlink($pfad)) { print $log "NACHRICHT\n"; print $log "#\n#\n#\n"; print $log "Habe die Datei $datei geloescht!\n"; } else { print $log "FEHLER\n"; print $log "#\n#\n#\n"; print $log "Konnte die Datei $datei nicht löschen! ($!)\n"; } next; } # alles andere nicht löschen! print "$datei ist Ordner oder Spezialdatei, wird ignoriert!\n"; } print $log "ENDE\n"; print $log "#\n#\n#\n"; # testen ob das Verzeichnis leer ist if(glob( File::Spec->join($dir,'*') )) { print $log "Habe die Ordner $dir nicht geloescht! Es ist nicht leer!\n"; } else { # rmdir löscht leere Verzeichnisse also den leeren Ordner rmdir($ordner) or die "ERROR remove $ordner $!"; print $log "Habe die Ordner $dir geloescht!\n"; } }