use File::Path; sub purge { my $n = shift; # 100, for example my @newest_first = do { my @dir = grep -d, ; my @age = map -M, @dir; @dir[ sort { $age[$a] <=> $age[$b] } 0 .. $#dir ]; }; splice @newest_first, 0, $n; rmtree \@newest_first, 0, 1 if @newest_first; }