use File::Find; my @exts = qw( jpg gif tar gz bat txt ); my @excludes = qw( winnt cygwin ); my $ext = join '|', map{quotemeta} @exts; my $exclude = join '|', map{quotemeta} @excludes; my $base = '/cygwin'; find( sub { push @datein, $File::Find::name if m/\.(?:$ext)$/oi and $File::Find::name !~ m!/(?:$exclude)!oi; }, $base ); print "$_\n" for @datein;