Python中检查目录权限

3
我希望您能提供一个Python程序,给定一个目录,它将返回该目录中所有具有775 (rwxrwxr-x)权限的目录。
谢谢!
5个回答

8

两个答案都没有使用递归,但是不完全清楚OP想要什么。这里提供一种递归方法(未经测试,但您可以理解思路):

import os
import stat
import sys

MODE = "775"

def mode_matches(mode, file):
    """Return True if 'file' matches 'mode'.

    'mode' should be an integer representing an octal mode (eg
    int("755", 8) -> 493).
    """
    # Extract the permissions bits from the file's (or
    # directory's) stat info.
    filemode = stat.S_IMODE(os.stat(file).st_mode)

    return filemode == mode

try:
    top = sys.argv[1]
except IndexError:
    top = '.'

try:
    mode = int(sys.argv[2], 8)
except IndexError:
    mode = MODE

# Convert mode to octal.
mode = int(mode, 8)

for dirpath, dirnames, filenames in os.walk(top):
    dirs = [os.path.join(dirpath, x) for x in dirnames]
    for dirname in dirs:
        if mode_matches(mode, dirname):
            print dirname

Python标准库的文档中描述了类似的内容,文档地址为stat


好的解决方案,你可以使用int(sys.argv[2], 8)将用户的八进制直接转换,而不是在函数内使用stat的返回值进行转换。 - nosklo
啊——确实!我已经更新了我的答案,将所需模式转换为八进制,而不是每次发现模式都反过来。谢谢! - lt_kije
如果在八进制数字前面加上0,例如0777,则可以直接写入八进制数字。这样做的结果与int("777", 8)相同,都是511。 - jorelli

6

请看os模块,特别是os.stat函数,可查看权限位。

import  os

for filename in os.listdir(dirname):
   path=os.path.join(dirname, filename)
   if os.path.isdir(path):
       if (os.stat(path).st_mode & 0777) == 0775:
           print path

你可以使用"if os.path.isdir(path) and (os.stat(path).st_mode & 0777) == 0775:"来代替两个if语句,使代码更加简洁易读。 - nosklo

2

基于Brian的答案的紧凑型生成器:

import os

(fpath for fpath 
   in (os.path.join(dirname,fname) for fname in os.listdir(dirname)) 
   if (os.path.isdir(fpath) and (os.stat(fpath).st_mode & 0777) == 0775))

1

一定要用Python吗?

你也可以使用find来完成:

"find . -perm 775"


0
您可以使用以下命令检查文件和目录的775权限。
path="location of file or directory"
if (oct(os.stat(path).st_mode)[-3:]=="775"):
    print(path)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接