A very simple but useful enhancement for shutil.chown function
Currently "shutil.chown" function effects only one directory or file user/group permission by adding "recursive" parameter it can easily effect all sub-directories/files
Source: https://hg.python.org/cpython/file/3.5/Lib/shutil.py#l1007
# Current:
def chown(path, user=None, group=None):
"""Change owner user and group of the given path.
user and group can be the uid/gid or the user/group names, and in that case,
they are converted to their respective uid/gid.
"""
if user is None and group is None:
raise ValueError("user and/or group must be set")
_user = user
_group = group
# -1 means don't change it
if user is None:
_user = -1
# user can either be an int (the uid) or a string (the system username)
elif isinstance(user, str):
_user = _get_uid(user)
if _user is None:
raise LookupError("no such user: {!r}".format(user))
if group is None:
_group = -1
elif not isinstance(group, int):
_group = _get_gid(group)
if _group is None:
raise LookupError("no such group: {!r}".format(group))
os.chown(path, _user, _group)
# Enhanced:
import os.path
# Internal Function
def _dir_walk(path):
''' Get All Directories & Files'''
for dir_path, dir_names, file_names in os.walk(path):
# Directories
for dir_name in dir_names:
yield os.path.join(dir_path, dir_name)
# Files
for file_name in file_names:
yield os.path.join(dir_path, file_name)
def chown(path, user=None, group=None, recursive=False):
"""Change owner user and group of the given path.
user and group can be the uid/gid or the user/group names, and in that case,
they are converted to their respective uid/gid.
"""
if user is None and group is None:
raise ValueError("user and/or group must be set")
_user = user
_group = group
# -1 means don't change it
if user is None:
_user = -1
# user can either be an int (the uid) or a string (the system username)
elif isinstance(user, str):
_user = _get_uid(user)
if _user is None:
raise LookupError("no such user: {!r}".format(user))
if group is None:
_group = -1
elif not isinstance(group, int):
_group = _get_gid(group)
if _group is None:
raise LookupError("no such group: {!r}".format(group))
# Default Do First
if not recursive:
os.chown(path, _user, _group)
else:
for recursive_path in _dir_walk(path):
os.chown(recursive_path, _user, _group)
hope this helps :)
|