cached recursive directory walk