Geo*_*off 35 python recursion chown
以递归方式将所有者和组设置为目录中的文件的"python方式"是什么?我可以将'chown -R'命令传递给shell,但我觉得我错过了一些明显的东西.
我对此很不满意:
import os
path = "/tmp/foo"
for root, dirs, files in os.walk(path):
for momo in dirs:
os.chown(momo, 502, 20)
Run Code Online (Sandbox Code Playgroud)
这似乎适用于设置目录,但在应用于文件时失败.我怀疑文件没有得到整个路径,因此chown失败,因为它无法找到文件.错误是:
'OSError:[Errno 2]没有这样的文件或目录:'foo.html'
我在这里俯瞰什么?
too*_*php 42
在dirs
和files
名单都总是相root
-也就是说,它们是basename()
文件/文件夹,即他们没有/
在他们(或\
在Windows上).root
如果希望代码能够进行无限级别的递归,则需要加入dirs/files来获取它们的整个路径:
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)
Run Code Online (Sandbox Code Playgroud)
我很惊讶shutil
模块没有这个功能.
cri*_*aig 19
我可以将“chown -R”命令传递给 shell
这是最简单的方法,并且有点迷失在这个问题中,所以为了清楚起见,如果您不关心 Windows,您可以在一行中执行此操作:
os.system('chown -R 502 /tmp/foo')
Run Code Online (Sandbox Code Playgroud)
Chr*_*lis 12
正如上面正确指出的那样,接受的答案遗漏了顶级文件和目录。其他答案使用os.walk
then 循环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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
替代aaa
,bb
随你而去