46

ディレクトリ内のファイルに所有者とグループを再帰的に設定する「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'

私はここで何を見落としていますか?

4

10 に答える 10

47

dirsおよびfilesリストはすべて常に相対的です。rootつまり、それらはファイル/フォルダーの です。つまり、それらには (またはウィンドウ上に)basename()はありません。コードを無限レベルの再帰で動作させたい場合は、ディレクトリ/ファイルを結合してパス全体を取得する必要があります。/\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モジュールにこのための機能がないことに驚いています。

于 2010-05-18T00:41:11.253 に答える
18

上記で正しく指摘されているように、受け入れられた回答にはトップレベルのファイルとディレクトリがありません。他の回答ではos.walk、次にループしてdirnamesand を使用しますfilenames。ただし、とにかくos.walk通過するため、ループをスキップして現在のディレクトリだけをスキップできます ( ) :dirnamesdirnameschowndirpath

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)
于 2019-08-12T09:22:57.967 に答える
6
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、あなたが好きなように

于 2010-05-18T00:25:42.493 に答える
4

os.path.join(root,momo)あなたに完全なパスを与えることを試してください

于 2010-05-18T00:07:57.030 に答える
2

これは、グロブを使用してファイルを再帰的にリストし、それらのアクセス許可を変更する関数です。

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

完璧ではありませんが、必要な場所に連れて行ってくれました

于 2011-06-30T20:04:12.797 に答える
1

for f in filesループも忘れないでください。同様に、os.path.join(root, f)フルパスを取得することを忘れないでください。

于 2010-05-18T00:19:03.967 に答える