2010-05-17 35 views
32

將所有者和組遞歸設置到目錄中的文件的「python方式」是什麼?我可以將一個'chown -R'命令傳遞給shell,但我覺得我錯過了一些明顯的東西。什麼是遞歸設置文件權限的Python方式?

我擺弄這樣的:


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

這似乎是用於設置目錄,但是,當應用到文件失敗。我懷疑文件沒有得到整個路徑,所以chown失敗,因爲它找不到文件。錯誤是:

「OSERROR:[錯誤2]沒有這樣的文件或目錄: 'foo.html'

什麼我俯瞰這裏?

回答

35

dirsfiles名單都始終相對於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模塊沒有的功能此。

+0

這有一個錯誤,我剛剛在生產中的同事代碼中看到:-)指定的最高級別目錄不是臨時的。我建議修正一個修補程序,希望它得到批准。 – 2016-03-21 14:30:10

+0

所以我的編輯被拒絕了 - 對任何使用這個並且遇到'/ tmp/foo'沒有更改其權限的錯誤的人來說都是好的。良好的工作適度SO蟒蛇 – 2016-03-21 16:53:21

+0

@AindindGoolcharan良好的捕獲 - 希望這是你的想法! – 2016-04-01 02:03:55

4

嘗試os.path.join(root,momo)會給你完整的路徑

1

不要忘了for f in files循環,無論是。同樣,請記住os.path.join(root, f)以獲取完整路徑。

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) 

替代aaabb,請你

+0

正如在接受的評論中,'/ tmp/foo'不會讓所有者正確設置。看到我上面的評論。 – 2016-03-21 14:34:43

2

這是我寫的一個函數,它使用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

使用os.lchown代替os.chown改變自己的鏈接和文件一起。

相關問題