Alle Dateien eines Verzeichnisses löschen - Aber bitte mit Ausnahmen!
Wie so oft stand ich mal wieder vor dem Problem, bestimmte Ordner zu leeren, aber nicht komplett, da einige Dateien unberührt bleiben sollten.
Da ich schon öfters das Problem hatte, hab ich nun endlich mal ne vernünftige Subroutine geschrieben, die das Problem ein für allemal erledigt.
Hier das Script:
sub clear_directory{#Parameter: @liste von Files, die nicht gelöscht werden soll my $directory=shift;
$directory=~ s/\/$//; # abschließendes / entfernen
my $dir; opendir ($dir,$directory); my @dir=readdir($dir); close $dir;
#verzeichnis löschen foreach (@dir){ next if ($_ eq '.' || $_ eq '..' || $dontdel{$_} == 1 || (-d "$directory/$_" )); my $res=unlink("$directory/$_");
}
}
Als Parameter erwartet die Soubroutine das Verzeichnis, und danach die Dateien, die nicht gelöscht werden sollen.
Beispiel:
clear_directory ('../test','einedatei.txt' , 'nochnedatei.txt'); oder push(@dateien,'einedatei.txt); push(@dateien,'nocheinedatei.txt); push(@dateien,'eineanderedatei.txt);
clear_directory ('../test',@dateien);
Was passiert hier?
Erst wird die Variable $directory festgelegt und das abschließende / entfernt, falls vorhanden.
Danach wird ein Hash %dontdel erzeugt, der alle Dateien enthält, die nicht gelöscht werden sollen.
Nach dem Einlesen des Verzeichnisses wird per foreach jede Datei getestet, ob sie ein Ordner ist oder in %dontdel vorhanden ist. Wenn ja, wird mit dem nächsten Eintrag weitergemacht, wenn nein, wird die Datei gelöscht.
Unterordner werden nicht berücksichtigt, Fehler werden nicht abgefangen, wenn also eine Datei gelöscht werden sollte und es trat ein Fehler auf, wird dieser nicht angezeigt.