code: def chownr(path, owner, group, follow_links=True, chowntopdir=False):
      
      uid = pwd.getpwnam(owner).pw_uid
      gid = grp.getgrnam(group).gr_gid
      if follow_links:
          chown = os.chown
      else:
          chown = os.lchown
  
      if chowntopdir:
          broken_symlink = os.path.lexists(path) and not os.path.exists(path)
          if not broken_symlink:
              chown(path, uid, gid)
      for root, dirs, files in os.walk(path, followlinks=follow_links):
          for name in dirs + files:
              full = os.path.join(root, name)
              broken_symlink = os.path.lexists(full) and not os.path.exists(full)
              if not broken_symlink:
                  chown(full, uid, gid)
docs: Recursively change user and group ownership of files and directories
      in given path. Doesn't chown path itself by default, only its children.
  
      :param str path: The string path to start changing ownership.
      :param str owner: The owner string to use when looking up the uid.
      :param str group: The group string to use when looking up the gid.
      :param bool follow_links: Also follow and chown links if True
      :param bool chowntopdir: Also chown path itself if True