use Parallel::ForkManager; my $pm = new Parallel::ForkManager($MAX_PROCESSES); # ... foreach my $f (@files) { if ( (-d $f) and ($f ne ".") and ($f ne "..") ){ my $pid = $pm->start and next; chdir ... system ... system ... system ... $pm->finish; } } $pm->wait_all_children;