Что такое Python метод рекурсивно установка прав?

каков" способ python " рекурсивно установить владельца и группу в файлы в каталоге? Я мог бы просто передать команду "chown-R" shell, но я чувствую, что упускаю что-то очевидное.

Я возиться с этим:


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

это, кажется, работает для установки каталога, но не выполняется при применении к файлам. Я подозреваю, что файлы не получают весь путь, поэтому chown терпит неудачу, поскольку он не может найти файлы. Ошибка:

' OSError: [Errno 2] нет такого файла или каталога: 'foo.HTML-код'

что я упускаю здесь?

7 ответов


на dirs и files списки все всегда относительно root - то есть они basename() файлы/папки, т. е. у них нет / (или \ на windows). Вам нужно присоединиться к dirs / files в root чтобы получить весь их путь, если вы хотите, чтобы ваш код работал на бесконечных уровнях рекурсии:

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)

Я удивлен shutil модуль не имеет функции для этого.


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)

заменить aaa и bb Как вам будет угодно


попробовать os.path.join(root,momo) Это даст вам полный путь


вот функция, которую я написал, которая использует glob для рекурсивного списка файлов и изменения их разрешений.

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)))

это не идеально, но получил меня там, где мне нужно было быть


Не забудьте for f in files петли, либо. Аналогично, не забудьте os.path.join(root, f) чтобы получить полный путь.


принятый ответ пропускает файлы верхнего уровня. Это фактический эквивалент chown -R.

import os

path = "/tmp/foo"

os.chown(path, 502, 20)
for dirpath, dirnames, filenames in os.walk(path):
    for dname in dirnames:
        os.chown(os.path.join(dirpath, dname), 502, 20)
    for fname in filenames:
        os.chown(os.path.join(dirpath, fname), 502, 20)

использовать os.lchown вместо os.chown на изменение самих ссылке и файлы вместе.