my $dir = '/path/to/dir'; my %files; my @keep; my @to_delete; opendir my $dir_h, $dir or die "Can't open directory $dir: $!"; while ( my $entry = readdir $dir_h ) { # hole den namen und den "counter" my ($name,$counter) =~ $entry =~ m{ (.*?) ([a-z]) \.txt }x; # wenn es keine Datei mit dem Muster ist, mache einfach mit # der nächsten Datei weiter next if !($name and $counter); # speichere den namen und das "zählkürzel" # $files->{TestA002}->{a} = 1 $files{$name}->{$counter} = 1; } closedir $dirh; # laufe über die Namen (z.B. TestA001, TestA002, ...) for my $name ( keys %files ) { # sortiere die "zählkürzel" absteigend. Das "höchste" wird in # $keep gespeichert, der Rest in @delete my ($keep,@delete) = sort{ $b cmp $a }keys %{ $files{$name} }; # setze den Dateinamen wieder zusammen und speichere es in @keep push @keep, "$name$keep.txt"; # für jedes andere Zählkürzel wird der Dateiname zusammengesetzt und # in @to_delete gespeichert. push @to_delete, map{ "$name$_.txt" }@delete; } print "Keep: @keep\nDelete: @to_delete\n";