Python中如何递归设置文件权限?
“python方式”是指用Python来递归地设置一个目录下文件的所有者和组。虽然我可以直接用'shell'命令中的'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'
我在这里忽略了什么呢?
10 个回答
19
我可以直接给命令行发一个 'chown -R' 的指令。
这是最简单的方法,可能在问题中有点模糊,所以为了更清楚一点,如果你不在乎Windows系统的话,你可以用一行命令来做到这一点:
os.system('chown -R 502 /tmp/foo')
31
正如上面正确指出的那样,接受的答案没有考虑到顶层的文件和目录。其他的答案使用了 os.walk
,然后再遍历 dirnames
和 filenames
。不过,os.walk
本身就会遍历 dirnames
,所以你可以直接跳过遍历 dirnames
的步骤,直接对当前目录 (dirpath
) 使用 chown
命令:
def recursive_chown(path, owner):
for dirpath, dirnames, filenames in os.walk(path):
shutil.chown(dirpath, owner)
for filename in filenames:
shutil.chown(os.path.join(dirpath, filename), owner)
47
dirs
和 files
这两个列表里的内容都是相对于 root
的,也就是说,它们只包含文件或文件夹的基本名称,不带有路径符号,比如 /
(在Linux或Mac上)或者 \
(在Windows上)。如果你想让你的代码能够处理无限层级的递归,就需要把这些目录和文件名跟 root
结合起来,才能得到它们的完整路径。
import os
path = "/tmp/foo"
# Change permissions for the top-level folder
os.chmod(path, 502, 20)
for root, dirs, files in os.walk(path):
# set perms on sub-directories
for momo in dirs:
os.chown(os.path.join(root, momo), 502, 20)
# set perms on files
for momo in files:
os.chown(os.path.join(root, momo), 502, 20)
让人惊讶的是,shutil
模块里居然没有提供这样的功能。