所有者とグループをディレクトリ内のファイルに再帰的に設定する「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 '
ここで見落としていることは何ですか?
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
モジュールにこのための関数がないことに驚いています。
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)
aaa
とbb
は自由に置き換えてください
フルパスを取得するos.path.join(root,momo)
を試してください
受け入れられた回答はトップレベルのファイルを見逃しています。これは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)
上記で正しく指摘したように、受け入れられた回答はトップレベルのファイルとディレクトリを見逃しています。他の回答はos.walk
を使用してから、dirnames
とfilenames
をループします。ただし、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)
これは、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)))
それは完璧ではありませんが、私が必要な場所に行きました
_for f in files
_ループも忘れないでください。同様に、完全なパスを取得するには、os.path.join(root, f)
を忘れないでください。
シェルに 'chown -R'コマンドを渡すだけで
これは最も簡単な方法であり、質問で少し迷子になるので、わかりやすくするために、Windowsを気にしない場合は、1行でこれを行うことができます。
os.system('chown -R 502 /tmp/foo')