2010-05-17 16 views
32

Cách "python" để đệ quy thiết lập chủ sở hữu và nhóm thành tệp trong thư mục? Tôi chỉ có thể vượt qua một lệnh 'chown -R' để shell, nhưng tôi cảm thấy như tôi đang thiếu một cái gì đó hiển nhiên.Cách Python để đệ quy thiết lập quyền truy cập tệp là gì?

Tôi mucking về với điều này:


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

Điều này dường như làm việc để thiết lập thư mục, nhưng không thành công khi áp dụng cho tập tin. Tôi nghi ngờ các tập tin không nhận được toàn bộ con đường, do đó, chown thất bại vì nó không thể tìm thấy các tập tin. Lỗi này là:

'OSError: [Errno 2] Không có tập tin hoặc thư mục như: 'foo.html'

tôi nhìn gì ở đây?

Trả lời

35

Các dirsfiles danh sách tất cả đều luôn luôn liên quan đến root - tức là, họ là những basename() của các tập tin/thư mục, tức là họ không có một / trong đó (hoặc \ trên cửa sổ). Bạn cần phải tham gia dirs/file để root để có được toàn bộ con đường của mình nếu bạn muốn mã của bạn để làm việc đến mức vô hạn của đệ quy:

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) 

Tôi ngạc nhiên module shutil không có chức năng này .

+0

Điều này có một lỗi mà tôi vừa thấy trong mã đồng nghiệp của tôi trong sản xuất :-) Thư mục cấp cao nhất được chỉ định không bị nhai. Tôi đã đề xuất chỉnh sửa với bản sửa lỗi, hy vọng nó được phê duyệt. –

+0

Vì vậy, chỉnh sửa của tôi đã bị từ chối - cái nhìn tốt cho bất cứ ai sử dụng này và gặp lỗi trong đó '/ tmp/foo' KHÔNG có quyền của nó thay đổi. Tốt công việc kiểm duyệt SO pythonians –

+0

@AvindraGoolcharan bắt tốt - hy vọng đó là những gì bạn có trong tâm trí! –

4

thử os.path.join(root,momo) rằng sẽ cung cấp cho bạn đường dẫn đầy đủ

1

Đừng quên for f in files vòng lặp, một trong hai. Tương tự, hãy nhớ os.path.join(root, f) để nhận đường dẫn đầy đủ.

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) 

thay aaabb khi bạn hài lòng

+0

Như trong nhận xét được chấp nhận, '/ tmp/foo' sẽ KHÔNG có chủ sở hữu được đặt chính xác. Xem nhận xét của tôi ở trên. –

2

Đây là một chức năng tôi đã viết sử dụng glob để đệ quy liệt kê các tệp và thay đổi quyền của chúng.

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

nó không phải là hoàn hảo, nhưng đã cho tôi nơi tôi cần phải

-2

sử dụng os.lchown thay vì os.chown cho thay đổi liên kết tự và các tập tin với nhau.

Các vấn đề liên quan