2009-04-01 9 views

Antwort

8

Weder antworten recurses, obwohl es nicht ganz klar ist, dass das ist, was das OP will. Hier ist eine rekursive Ansatz (ungetestet, aber Sie erhalten die Idee):

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 

Etwas Ähnliches ist für stat in der stdlib Dokumentation beschrieben.

+0

gute Lösung, könnten Sie Int (sys.argv [2], 8) verwenden, um das Benutzer oktal direkt zu konvertieren, anstatt es in der Funktion mit der Rückkehr von stat – nosklo

+0

Ah tun - in der Tat! Ich habe meine Antwort aktualisiert, um den gewünschten Modus in Oktal zu konvertieren, anstatt für jeden erkannten Modus den umgekehrten Weg zu gehen. Vielen Dank! –

+0

können Sie Oktalzahlen auch direkt schreiben, wenn Sie eine 0 vor ihnen setzen, z. 0777 ergibt 511 wie int ("777", 8) – jorelli

-1

Muss es Python sein?

Sie können auch das tun finden verwenden:

"finden -perm 775."

+0

Dank dieser auch helfen! –

5

Werfen Sie einen Blick auf das os Modul. Insbesondere os.stat, um die Erlaubnis Bits zu sehen.

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 
+0

Sie könnten es kompakter und noch lesbar machen mit "if os.path.isdir (Pfad) und (os.stat (Pfad). St_mode & 0777) == 0775:" anstelle von zwei Wenns. – nosklo

2

Compact Generator basiert auf Brians Antwort:

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))