2013-07-23 18 views

risposta

11

Dal momento che Python 3.3 è possibile utilizzare stat.filemode:

In [7]: import os, stat 

In [8]: print(stat.filemode(os.stat('/home/soon/foo').st_mode)) 
-rw-r--r-- 

In [9]: ls -l ~/foo 
-rw-r--r-- 1 soon users 0 Jul 23 18:15 /home/soon/foo 
+7

+1 Può funzionare in altre versioni python così, è sufficiente copiare la funzione ei relativi dati dal [codice sorgente] (http://hg.python.org/cpython/file/3.3/Lib/stat.py). Demo: http://ideone.com/P45ChT –

2

La seguente funzione otterrà ciò, date alcune circostanze normali (ad esempio, non l'ho provato su Windows o con SELinux).

import stat 
def permissions_to_unix_name(st_mode): 
    permstr = '' 
    usertypes = ['USR', 'GRP', 'OTH'] 
    for usertype in usertypes: 
     perm_types = ['R', 'W', 'X'] 
     for permtype in perm_types: 
      perm = getattr(stat, 'S_I%s%s' % (permtype, usertype)) 
      if st_mode & perm: 
       permstr += permtype.lower() 
      else: 
       permstr += '-' 
    return permstr 

Questo produce una stringa di base come richiesto. Tuttavia, questo potrebbe anche essere migliorato per visualizzare ulteriori dati, ad es. se si tratta di una directory (d) o di un collegamento simbolico (l). Sentiti libero di migliorarlo.

4

Qualcosa di simile a questo:

import stat, os 
def permissions_to_unix_name(st): 
    is_dir = 'd' if stat.S_ISDIR(st.st_mode) else '-' 
    dic = {'7':'rwx', '6' :'rw-', '5' : 'r-x', '4':'r--', '0': '---'} 
    perm = str(oct(st.st_mode)[-3:]) 
    return is_dir + ''.join(dic.get(x,x) for x in perm) 
... 

>>> permissions_to_unix_name(os.stat('.')) 
'drwxr-xr-x' 
>>> ls -ld . 
drwxr-xr-x 62 monty monty 4096 Jul 23 13:23 ./ 

>>> permissions_to_unix_name(os.stat('so.py')) 
'-rw-rw-r--' 
>>> ls -ld so.py 
-rw-rw-r-- 1 monty monty 68 Jul 18 15:57 so.py 
Problemi correlati