Что такое 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
Как вам будет угодно
вот функция, которую я написал, которая использует 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)