/root +dir1 +1a +1b +dir2 +2a +2b +2c #### /root #### /root/dir1 /root/dir2/2a /root/dir2/3a #### use File::Find; my @abs_dirs = qw ( /usr/local/share/locale ); my %abs_dirs; @abs_dirs{@abs_dirs} = (); my @OK_dir; my %all; find( sub { $File::Find::prune = 1, return if -d and ( exists $abs_dirs{$File::Find::name} ); my $dir = $File::Find::name; return if -f $dir; if ( ( grep { $_ =~ m/$dir/ } @abs_dirs ) and ( !exists $all{$dir} ) ) { $all{$dir}; } else { push @OK_dir, $dir; $File::Find::prune = 1; return; } }, "/usr/local/" );