support recursive dirs