use File::Find; find ({ 'wanted' => \&processfile, 'follow' => 0 }, '/'); sub processfile { my ($dev, $ino, $mode, $nlink, $uid, $gid); return unless (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_)); return unless -f _ && -r _ && /^.*\.java\z/si; ... };