如何从' -rw-r - r - '回到33188?

时间:2017-09-07 14:39:52

标签: python unix file-permissions bitmask

stat.pya helper functionos.stat报告的st_mode(整数)进入熟悉的" stringy"格式(我不知道这个表示是否有正确的名称)。

>>> stat.filemode(0o100644)
'-rw-r--r--'

是否有辅助功能走另一条路?

>>> filemode_inv('-rw-r--r--')
33188

这是我尝试过的,但它产生了错误的结果。这并没有正确处理表示文件类型的第一个字符,也没有处理粘滞位等

table = {ord('r'): '1', ord('w'): '1', ord('-'): '0'}

def filemode_inv(s):
    return int(s.translate(table), 2)

1 个答案:

答案 0 :(得分:2)

Python是开源的,您只需阅读stat模块的源代码并编写反函数。

请参阅:https://github.com/python/cpython/blob/master/Lib/stat.py#L112

import stat

def un_filemode(mode_str):
    mode = 0
    for char, table in zip(mode_str, stat._filemode_table):
        for bit, bitchar in table:
            if char == bitchar:
                mode |= bit
                break
    return mode

请注意,我是顽皮的"并访问stat模块的私有成员。通常的警告适用。

另请注意,stat.filemode的文档无论如何都不正确,因为0o100000在技术上不属于文件模式,它是文件类型S_IFREG。来自inode(7)

  

POSIX是指与掩码S_IFMT对应的stat.st_mode位(见下文)作为文件类型,12位对应于掩码07777作为文件模式位和最低有效9位(0777) )作为文件权限位。