use File::Find; find( sub { return unless $File::Find::name =~ m{^/var/log/HOSTS/([^/]+)/([^/]+)/(\d+)/(\d+)/(\d+)/(.*)$}; my( $dir1, $dir2, $year, $month, $day, $file ) = ( $1, $2, $3, $4, $5, $6 ); # do stuff with $file }, '/var/log/HOSTS' );