## start in the dir above your client dirs use File::Find; my @del_dirs; find(\&del_dirs, '.'); sub del_dirs { return unless -d $_; return unless $File::Find::name =~ m{^\./.+?/.+}; # at least in project level return if $File::Find::name =~ m{^\./.+?/.+?/.+}; # but no lower ### check for age or whatnot here, return if you don't want deletion ### push @del_dirs, 'rm '.$File::Find::name; } #### my @del_dirs; opendir primary, '.' or die $!; foreach my $client (readdir primary) { opendir client, $client or die $!; foreach (readdir client) { ## check date, etc. use 'next' if you want to keep push @del_dirs, 'rm '.$client.'/'.$_; } closedir client; } closedir primary;