Как Python рекурсивно устанавливает права доступа к файлам? - PullRequest
34 голосов
/ 18 мая 2010

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

Я слоняюсь по этому поводу:


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 ]

40 голосов
/ 18 мая 2010

Списки dirs и files все всегда относятся к root - т.е. они являются basename() файлами / папками, то есть в них нет / (или \ на окнах). Вам нужно присоединить каталоги / файлы к 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 не имеет функции для этого.

6 голосов
/ 18 мая 2010
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, как вам угодно

4 голосов
/ 18 мая 2010

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

2 голосов
/ 21 сентября 2018

Принятый ответ не попадает в файлы верхнего уровня. Это фактический эквивалент 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)
2 голосов
/ 01 июля 2011

Вот функция, которую я написал, которая использует 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)))

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

1 голос
/ 18 мая 2010

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

0 голосов
/ 26 августа 2013

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

...