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