use File::Find; my @abs_dirs=qw(/dont/go/here /stay/out); my @all_dirs=qw(.CVS .stayout); my %abs_dirs; @abs_dirs{@abs_dirs}=(); my %all_dirs; @all_dirs{@all_dirs}=() find (sub { $File::Find::prune=1, return if -d and (exists $abs_dirs{$File::Find::name} or exists $all_dirs{$_}); # Process other files, dirs # }, ".");