torres recursivos recursividad recursiva programacion problemas pilas informatica hanoi funcion fractal ejemplos arbol algoritmo python recursion chown

recursivos - ¿Cuál es la forma de Python para establecer permisos de archivos recursivamente?



recursividad python ejemplos (6)

Aquí hay una función que escribí que usa glob para enumerar recursivamente archivos y cambiar sus permisos.

import os import glob def recursive_file_permissions(path,mode,uid=-1,gid=-1): '''''' Recursively updates file permissions on a given path. UID and GID default to -1, and mode is required '''''' for item in glob.glob(path+''/*''): if os.path.isdir(item): recursive_file_permissions(os.path.join(path,item),mode,uid,gid) else: try: os.chown(os.path.join(path,item),uid,gid) os.chmod(os.path.join(path,item),mode) except: print(''File permissions on {0} not updated due to error.''.format(os.path.join(path,item)))

no es perfecto, pero me llevó a donde necesitaba estar

¿Cuál es la "forma de python" para establecer de forma recursiva el propietario y el grupo de archivos en un directorio? Podría pasarle un comando ''chown -R'' a Shell, pero siento que me falta algo obvio.

Me estoy volviendo loco con esto:

import os path = "/tmp/foo" for root, dirs, files in os.walk(path): for momo in dirs: os.chown(momo, 502, 20)

Esto parece funcionar para configurar el directorio, pero falla cuando se aplica a los archivos. Sospecho que los archivos no obtienen la ruta completa, por lo que chown falla, ya que no puede encontrar los archivos. El error es:

''OSError: [Errno 2] No existe dicho archivo o directorio:'' foo.html ''

¿Qué estoy pasando por alto aquí?


Los dirs y las listas de files son siempre relativos a la root , es decir, son el basename() de los archivos / carpetas, es decir, no tienen un / en ellos (o / en Windows). Debe unir los directorios / archivos a la root para obtener su ruta completa si desea que su código funcione a niveles infinitos de recursión:

import os path = "/tmp/foo" for root, dirs, files in os.walk(path): for momo in dirs: os.chown(os.path.join(root, momo), 502, 20) for momo in files: os.chown(os.path.join(root, momo), 502, 20)

Me sorprende que el módulo shutil no tenga una función para esto.


No olvide el bucle for f in files , tampoco. Del mismo modo, recuerde os.path.join(root, f) para obtener la ruta completa.


prueba os.path.join(root,momo) que te dará la ruta completa


use os.lchown lugar de os.chown para cambiar el enlace y los archivos juntos.


import os path = "/tmp/foo" for root, dirs, files in os.walk(path): for momo in dirs: os.chown(momo, 502, 20) for file in files: fname = os.path.join(root, file) os.chown(fname, aaa, bb)

sustituir aaa y bb como lo desee