2010-05-17 6 views
32

Quelle est la "méthode python" pour définir récursivement le propriétaire et le groupe dans les fichiers d'un répertoire? Je pourrais juste passer une commande 'chown -R' pour le shell, mais j'ai l'impression qu'il me manque quelque chose d'évident.Quelle est la méthode Python pour la définition récursive des autorisations de fichiers?

Je déblayage à propos de ceci:


import os 
path = "/tmp/foo" 
for root, dirs, files in os.walk(path): 
    for momo in dirs: 
    os.chown(momo, 502, 20) 

Cela semble fonctionner pour le réglage du répertoire, mais échoue lorsqu'il est appliqué aux fichiers. Je soupçonne que les fichiers n'obtiennent pas le chemin complet, donc chown échoue car il ne peut pas trouver les fichiers. L'erreur est:

« OSError: [Errno 2] Aucun fichier ou répertoire: 'foo.html'

Que suis-je ici donnent sur?

Répondre

35

Le dirs et files listes sont toujours par rapport à root - à savoir, ils sont les basename() des fichiers/dossiers, à savoir qu'ils ne disposent pas d'un / dans eux (ou \ sur les fenêtres). Vous devez joindre les dirs/fichiers à root pour obtenir leur chemin complet si vous voulez que votre code fonctionne à des niveaux infinis de récursion:

import os 
path = "/tmp/foo" 
for root, dirs, files in os.walk(path): 
    for momo in dirs: 
    os.chown(os.path.join(root, momo), 502, 20) 
    for momo in files: 
    os.chown(os.path.join(root, momo), 502, 20) 

Je suprised le module shutil ne dispose pas d'une fonction pour cette .

+0

Cela a un bug que je viens de voir dans le code de mon collègue en production :-) Le répertoire de haut niveau spécifié n'est pas sacré. J'ai suggéré une modification avec un correctif, j'espère que cela sera approuvé. –

+0

Donc, mon édition a été rejetée - attention à quiconque utilise ceci et rencontre le bug où '/ tmp/foo' n'a pas ses permissions changées. Bon travail de modération SO pythoniens –

+0

@AvindraGoolcharan bonne prise - j'espère que c'était ce que vous aviez en tête! –

4

essayer os.path.join(root,momo) qui vous donnera le chemin complet

1

Ne pas oublier la boucle for f in files, que ce soit. De même, n'oubliez pas de os.path.join(root, f) pour obtenir le chemin complet.

5
import os 
path = "/tmp/foo" 
for root, dirs, files in os.walk(path): 
    for momo in dirs: 
    os.chown(momo, 502, 20) 
    for file in files: 
    fname = os.path.join(root, file) 
    os.chown(fname, aaa, bb) 

substitut aaa et bb comme bon vous

+0

Comme dans le commentaire accepté, '/ tmp/foo' n'aura pas le propriétaire correctement défini. Voir mes commentaires ci-dessus. –

2

Voici une fonction que j'écris qui utilise glob pour récursivement répertorier les fichiers et modifier leurs permissions.

import os 
import glob 
def recursive_file_permissions(path,mode,uid=-1,gid=-1): 
     ''' 
     Recursively updates file permissions on a given path. 
     UID and GID default to -1, and mode is required 
     ''' 
    for item in glob.glob(path+'/*'): 
     if os.path.isdir(item): 
      recursive_file_permissions(os.path.join(path,item),mode,uid,gid) 
     else: 
      try: 
       os.chown(os.path.join(path,item),uid,gid) 
       os.chmod(os.path.join(path,item),mode) 
      except: 
       print('File permissions on {0} not updated due to error.'.format(os.path.join(path,item))) 

ce n'est pas parfait, mais m'a là où je devais être

-2

utilisation os.lchown au lieu de os.chown pour changer se relier et les fichiers ensemble.

Questions connexes