S_IFDIR = 0o040000 # directory
S_IFCHR = 0o020000 # character device
S_IFBLK = 0o060000 # block device
S_IFREG = 0o100000 # regular file
S_IFIFO = 0o010000 # fifo (named pipe)
S_IFLNK = 0o120000 # symbolic link
S_IFSOCK = 0o140000 # socket file
S_ISUID = 0o4000 # set UID bit
S_ISGID = 0o2000 # set GID bit
S_ENFMT = S_ISGID # file locking enforcement
S_ISVTX = 0o1000 # sticky bit
S_IREAD = 0o0400 # Unix V7 synonym for S_IRUSR
S_IWRITE = 0o0200 # Unix V7 synonym for S_IWUSR
S_IEXEC = 0o0100 # Unix V7 synonym for S_IXUSR
S_IRWXU = 0o0700 # mask for owner permissions
S_IRUSR = 0o0400 # read by owner
S_IWUSR = 0o0200 # write by owner
S_IXUSR = 0o0100 # execute by owner
S_IRWXG = 0o0070 # mask for group permissions
S_IRGRP = 0o0040 # read by group
S_IWGRP = 0o0020 # write by group
S_IXGRP = 0o0010 # execute by group
S_IRWXO = 0o0007 # mask for others (not in group) permissions
S_IROTH = 0o0004 # read by others
S_IWOTH = 0o0002 # write by others
S_IXOTH = 0o0001 # execute by others
_filemode_table = (
((S_IFLNK, "l"),
(S_IFREG, "-"),
(S_IFBLK, "b"),
(S_IFDIR, "d"),
(S_IFCHR, "c"),
(S_IFIFO, "p")),
((S_IRUSR, "r"),),
((S_IWUSR, "w"),),
((S_IXUSR|S_ISUID, "s"),
(S_ISUID, "S"),
(S_IXUSR, "x")),
((S_IRGRP, "r"),),
((S_IWGRP, "w"),),
((S_IXGRP|S_ISGID, "s"),
(S_ISGID, "S"),
(S_IXGRP, "x")),
((S_IROTH, "r"),),
((S_IWOTH, "w"),),
((S_IXOTH|S_ISVTX, "t"),
(S_ISVTX, "T"),
(S_IXOTH, "x"))
)
def filemode(mode):
"""Convert a file's mode to a string of the form '-rwxrwxrwx'."""
perm = []
for table in _filemode_table:
for bit, char in table:
if mode & bit == bit:
perm.append(char)
break
else:
perm.append("-")
return "".join(perm)
import os
print filemode(os.stat('.').st_mode)
U19JRkRJUiAgPSAwbzA0MDAwMCAgIyBkaXJlY3RvcnkKU19JRkNIUiAgPSAwbzAyMDAwMCAgIyBjaGFyYWN0ZXIgZGV2aWNlClNfSUZCTEsgID0gMG8wNjAwMDAgICMgYmxvY2sgZGV2aWNlClNfSUZSRUcgID0gMG8xMDAwMDAgICMgcmVndWxhciBmaWxlClNfSUZJRk8gID0gMG8wMTAwMDAgICMgZmlmbyAobmFtZWQgcGlwZSkKU19JRkxOSyAgPSAwbzEyMDAwMCAgIyBzeW1ib2xpYyBsaW5rClNfSUZTT0NLID0gMG8xNDAwMDAgICMgc29ja2V0IGZpbGUKClNfSVNVSUQgPSAwbzQwMDAgICMgc2V0IFVJRCBiaXQKU19JU0dJRCA9IDBvMjAwMCAgIyBzZXQgR0lEIGJpdApTX0VORk1UID0gU19JU0dJRCAjIGZpbGUgbG9ja2luZyBlbmZvcmNlbWVudApTX0lTVlRYID0gMG8xMDAwICAjIHN0aWNreSBiaXQKU19JUkVBRCA9IDBvMDQwMCAgIyBVbml4IFY3IHN5bm9ueW0gZm9yIFNfSVJVU1IKU19JV1JJVEUgPSAwbzAyMDAgIyBVbml4IFY3IHN5bm9ueW0gZm9yIFNfSVdVU1IKU19JRVhFQyA9IDBvMDEwMCAgIyBVbml4IFY3IHN5bm9ueW0gZm9yIFNfSVhVU1IKU19JUldYVSA9IDBvMDcwMCAgIyBtYXNrIGZvciBvd25lciBwZXJtaXNzaW9ucwpTX0lSVVNSID0gMG8wNDAwICAjIHJlYWQgYnkgb3duZXIKU19JV1VTUiA9IDBvMDIwMCAgIyB3cml0ZSBieSBvd25lcgpTX0lYVVNSID0gMG8wMTAwICAjIGV4ZWN1dGUgYnkgb3duZXIKU19JUldYRyA9IDBvMDA3MCAgIyBtYXNrIGZvciBncm91cCBwZXJtaXNzaW9ucwpTX0lSR1JQID0gMG8wMDQwICAjIHJlYWQgYnkgZ3JvdXAKU19JV0dSUCA9IDBvMDAyMCAgIyB3cml0ZSBieSBncm91cApTX0lYR1JQID0gMG8wMDEwICAjIGV4ZWN1dGUgYnkgZ3JvdXAKU19JUldYTyA9IDBvMDAwNyAgIyBtYXNrIGZvciBvdGhlcnMgKG5vdCBpbiBncm91cCkgcGVybWlzc2lvbnMKU19JUk9USCA9IDBvMDAwNCAgIyByZWFkIGJ5IG90aGVycwpTX0lXT1RIID0gMG8wMDAyICAjIHdyaXRlIGJ5IG90aGVycwpTX0lYT1RIID0gMG8wMDAxICAjIGV4ZWN1dGUgYnkgb3RoZXJzCgpfZmlsZW1vZGVfdGFibGUgPSAoCiAgICAoKFNfSUZMTkssICAgICAgICAgImwiKSwKICAgICAoU19JRlJFRywgICAgICAgICAiLSIpLAogICAgIChTX0lGQkxLLCAgICAgICAgICJiIiksCiAgICAgKFNfSUZESVIsICAgICAgICAgImQiKSwKICAgICAoU19JRkNIUiwgICAgICAgICAiYyIpLAogICAgIChTX0lGSUZPLCAgICAgICAgICJwIikpLAoKICAgICgoU19JUlVTUiwgICAgICAgICAiciIpLCksCiAgICAoKFNfSVdVU1IsICAgICAgICAgInciKSwpLAogICAgKChTX0lYVVNSfFNfSVNVSUQsICJzIiksCiAgICAgKFNfSVNVSUQsICAgICAgICAgIlMiKSwKICAgICAoU19JWFVTUiwgICAgICAgICAieCIpKSwKCiAgICAoKFNfSVJHUlAsICAgICAgICAgInIiKSwpLAogICAgKChTX0lXR1JQLCAgICAgICAgICJ3IiksKSwKICAgICgoU19JWEdSUHxTX0lTR0lELCAicyIpLAogICAgIChTX0lTR0lELCAgICAgICAgICJTIiksCiAgICAgKFNfSVhHUlAsICAgICAgICAgIngiKSksCgogICAgKChTX0lST1RILCAgICAgICAgICJyIiksKSwKICAgICgoU19JV09USCwgICAgICAgICAidyIpLCksCiAgICAoKFNfSVhPVEh8U19JU1ZUWCwgInQiKSwKICAgICAoU19JU1ZUWCwgICAgICAgICAiVCIpLAogICAgIChTX0lYT1RILCAgICAgICAgICJ4IikpCikKCmRlZiBmaWxlbW9kZShtb2RlKToKICAgICIiIkNvbnZlcnQgYSBmaWxlJ3MgbW9kZSB0byBhIHN0cmluZyBvZiB0aGUgZm9ybSAnLXJ3eHJ3eHJ3eCcuIiIiCiAgICBwZXJtID0gW10KICAgIGZvciB0YWJsZSBpbiBfZmlsZW1vZGVfdGFibGU6CiAgICAgICAgZm9yIGJpdCwgY2hhciBpbiB0YWJsZToKICAgICAgICAgICAgaWYgbW9kZSAmIGJpdCA9PSBiaXQ6CiAgICAgICAgICAgICAgICBwZXJtLmFwcGVuZChjaGFyKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBwZXJtLmFwcGVuZCgiLSIpCiAgICByZXR1cm4gIiIuam9pbihwZXJtKQogICAgCmltcG9ydCBvcwpwcmludCBmaWxlbW9kZShvcy5zdGF0KCcuJykuc3RfbW9kZSkK