web-dev-qa-db-ja.com

Pythonファイルのアクセス許可を再帰的に設定する方法は何ですか?

所有者とグループをディレクトリ内のファイルに再帰的に設定する「Pythonの方法」とは何ですか?私はシェルに 'chown -R'コマンドを渡すだけでいいのですが、明らかなものがないように感じます。

私はこれでいじくっています:


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

これはディレクトリの設定には機能するようですが、ファイルに適用すると失敗します。ファイルが完全なパスを取得していないと思われるので、chownはファイルを見つけることができないため失敗します。エラーは:

'OSError:[Errno 2]そのようなファイルまたはディレクトリはありません:' foo.html '

ここで見落としていることは何ですか?

35
Geoff

dirsおよびfilesリストはすべてrootに常に関連しています。つまり、これらはファイル/フォルダーのbasename()です。つまり、 /中(または\(Windowsの場合)。コードを無限レベルの再帰で機能させたい場合は、dirs/filesをrootに結合して、それらの完全なパスを取得する必要があります。

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)

shutilモジュールにこのための関数がないことに驚いています。

43
too much php
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)

aaabbは自由に置き換えてください

6
Escualo

フルパスを取得するos.path.join(root,momo)を試してください

4
Kugel

受け入れられた回答はトップレベルのファイルを見逃しています。これはchown -Rの実際の同等物です。

import os

path = "/tmp/foo"

os.chown(path, 502, 20)
for dirpath, dirnames, filenames in os.walk(path):
    for dname in dirnames:
        os.chown(os.path.join(dirpath, dname), 502, 20)
    for fname in filenames:
        os.chown(os.path.join(dirpath, fname), 502, 20)
2
nlsun

上記で正しく指摘したように、受け入れられた回答はトップレベルのファイルとディレクトリを見逃しています。他の回答はos.walkを使用してから、dirnamesfilenamesをループします。ただし、os.walkはとにかくdirnamesを通過するため、dirnamesをループしてスキップするだけで、現在のディレクトリ(chown)をdirpathするだけです。

def recursive_chown(path, owner):
    for dirpath, dirnames, filenames in os.walk(path):
        shutil.chown(dirpath, owner)
        for filename in filenames:
            shutil.chown(os.path.join(dirpath, filename), owner)
2
Christian Alis

これは、globを使用してファイルを再帰的にリストし、それらの権限を変更する私が書いた関数です。

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

それは完璧ではありませんが、私が必要な場所に行きました

2
Keith Hamilton

_for f in files_ループも忘れないでください。同様に、完全なパスを取得するには、os.path.join(root, f)を忘れないでください。

1
dash-tom-bang

シェルに 'chown -R'コマンドを渡すだけで

これは最も簡単な方法であり、質問で少し迷子になるので、わかりやすくするために、Windowsを気にしない場合は、1行でこれを行うことができます。

os.system('chown -R 502 /tmp/foo')
0
crizCraig