Python中如何递归设置文件权限?

54 投票
10 回答
74152 浏览
提问于 2025-04-15 22:50

“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,然后再遍历 dirnamesfilenames。不过,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

dirsfiles 这两个列表里的内容都是相对于 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 模块里居然没有提供这样的功能。

撰写回答