gpt4 book ai didi

python - 当模式被忽略时,使用 os.makedirs() 的最佳方法是什么

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:26 25 4
gpt4 key购买 nike

在我正在使用的 Linux 服务器上,我需要创建具有以下结构的目录:

/dir1/dir2/dir3/YYYY/MM/DD/file.ext

在某些情况下(因为目录取决于日期)我需要一次创建多个目录,例如 .../2011/01/01/,所有这些都需要权限 0o2755。

当我在服务器上使用 os.makedirs(dir, mode=0o2755) 时,它会正确设置权限的 0o755 部分,但忽略 SGID (2) 位。我猜测这是因为 os.makedirs 忽略了某些系统上的权限,如文档所述。我读到其他人在使用 umask 和 os.makedirs() 时遇到了问题,但我尝试过使用 umask(它设置为 0002,我尝试过 0000),但它仍然忽略 SGID 位。

我的解决方案是以下函数:

def special_makedirs(base_dir, target_dir, mode=0o2755):
base_dir = os.path.abspath(base_dir)
target_dir = os.path.abspath(target_dir)
if os.path.commonprefix([base_dir, target_dir]) != base_dir:
log.error("Target directory %s is not a subdirectory of %s" %(target_dir, base_dir))
raise ValueError("Target directory %s is not a subdirectory of %s" % (target_dir, base_dir))

# Create initial directory
os.makedirs(target_dir, mode=mode)

# Verify permissions
temp = target_dir
while temp != base_dir and stat.S_IMODE(os.stat(temp)) != mode:
os.chmod(temp, mode)
temp = os.path.split(temp)[0]

现在我确信这不能满足所有情况,但我将是唯一一个使用此函数来满足我的特定需求的人。

所以...我的问题是:

  1. 当 os.makedirs 文档说它忽略某些系统上的权限时,我是否误解了它?其他人也遇到过这个问题吗?

  2. 我的函数看起来是解决此问题的最有效方法吗?

感谢您提供的任何提示。抱歉,如果我的情况没有意义。

最佳答案

来自 mkdir(2) 手册页:

NOTES
Under Linux apart from the permission bits, only the S_ISVTX mode bit
is honored. That is, under Linux the created directory actually gets
mode (mode & ~umask & 01777).

所以是的,SGID 被忽略。事后设置。

关于python - 当模式被忽略时,使用 os.makedirs() 的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6320058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com