6

質問:

stat関数を効率的に使用して意味のあるファイル権限 (ユーザー、グループ、その他) を取得するにはどうすればよいですか。

詳細:

次のようにファイルのアクセス許可を照会しています。

statInfo = os.stat
permissions = stat.S_IMODE ( os.stat ( 'fooBar.txt' ).st_mode )

これは、パーミッションを 10 進形式で返します。したがってfooBar.txt、8 進数のファイル許可がある場合0700、ここでpermissionsは 10 進数の値が設定されます448。私が望むのは、パーミッションごとに 9 つの変数 ( ownerReadownerWrightownerExecutegroupRead...) を設定することです。これを行う場合は、次のようなブルー​​ト フォース メソッドを使用します。

statInfo = os.stat
permissions = stat.S_IMODE ( os.stat ( 'fooBar.txt' ).st_mode )
octPermissions = oct ( permissions )

ownerRead = octPermissions [1] >= 4
ownerWrite = octPermissions [1] == 2 or octPermissions [1] == 6 or octPermissions [1] == 3 or 
ownerExecute = octPermissions [1] == 1 or octPermissions [1] == 5 or octPermissions [1] == 3

この関数がかなり呼び出されるため、8 進数に変換することなくこれを行うより効率的な方法はありますか?

4

3 に答える 3

5

statモジュールでビット単位のANDと定数を使用します。

import stat
import os

mode = os.stat('fooBar.txt').st_mode

otherRead  = bool(mode & stat.S_IROTH)
otherWrite = bool(mode & stat.S_IWOTH)
otherExec  = bool(mode & stat.S_IXOTH)
...

はるかに読みやすい。

于 2012-05-24T16:43:36.600 に答える
5

ビットごとの AND 演算子を使用できます。

m = os.stat('fooBar.txt').st_mode
otherExec  = bool(m & 0001)
otherWrite = bool(m & 0002)
otherRead  = bool(m & 0004)
groupExec  = bool(m & 0010)
groupWrite = bool(m & 0020)
groupRead  = bool(m & 0040)
...
于 2012-05-24T16:35:34.287 に答える
3

これを、UNIX 権限を取得する関数にまとめました。

import os
from stat import (S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP,
                  S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH)

def bit2int(bit):
    return int(oct(bit))

def convert_st_mode(st_mode):
    bits = (S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP,
            S_IROTH, S_IWOTH, S_IXOTH)
    mode = "%03d" % sum(int(bool(st_mode & bit)) * bit2int(bit) for bit in bits)
    return mode

def get_unix_permissions(pth):
    mode = convert_st_mode(os.stat(pth).st_mode)
    return mode

使用法:

mode = get_unix_permissions("somefile")
print(mode)
于 2013-12-24T01:12:19.650 に答える