use File::DosGlob; my $root = '/some/where/interesting/*'; # don't forget the *! my $name = 'Smith'; # what you are searhcing for my @m = File::DosGlob::doglob(1,$root); for $fn (@m) { if -d($fn) { push @m, File::DosGlob::doglob(1,$fn.'/*'); next; } # uncomment to only search .txt files # next unless ($fn=~/\.txt$/); open (FILE,$fn) or warn "unable to search file $fn because $!\n"; while () { next unless (index($_,$name) >=0); # you could use a regex here print "$fn: $_"; last; # unless you want all occurences } close(FILE); }