猿问

递归创建具有特定所有者和组的目录

我想递归地创建一个目录并为创建的文件夹及其父级分配一个所有者和组。

例如,假设/var存在,我想创建/var/test1/test2/test3.

我可以使用os.MkdirAll("/var/test1/test2/test3", 0600).

不过,我也想一套test1test2test3uiduser1giduser1

可以使用 来做到这一点os.Chown,但这需要大量的手动工作。在创建文件夹链之前,我需要构建一个不存在的文件夹树及其父文件夹,然后os.Chown在创建后在每个文件夹上使用。

有没有更简单的方法?


HUH函数
浏览 178回答 2
2回答

慕的地10843

有点像这种ChownR()类型的函数,想法是过滤步行,并将 chown 仅应用于作为传入参数的路径的一部分的文件夹(此处"/var/test1/test2/test3)无过滤器:func ChownR(path string, uid, gid int) error {    return filepath.Walk(path, func(name string, info os.FileInfo, err error) error {        if err == nil {            err = os.Chown(name, uid, gid)        }        return err    })}换句话说,filepath.Walk()这里不应该涉及太多的“手工工作”。

隔江千里

将 mkdir 进程切换到您希望为其创建目录的用户。这具有在单个命令中创建具有正确权限和所有权的目录的优点,而不是创建循环或背靠背运行多个命令。例子:import "os/exec"import "syscall"func main() {    // The command here can use flags to create all of the dirs at once    cmd := exec.Command('mkdir', '-p', '/var/test1/test2/test3/')    _ = syscall.Umask(0077) // Set umask for this process    cmd.SysProcAttr = &syscall.SysProcAttr{}    cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uid, Gid: gid}    cmd.Run()}由于子进程“mkdir”以 指定的用户身份运行uid,因此文件夹已经拥有正确的所有者。如果 umask 部分正确,每个目录也将具有正确的权限。一个警告:这不是一个非常便携的解决方案。如果您确定您的代码只会在特定的操作系统上执行,那么使用 syscall 应该只是您的解决方案。
随时随地看视频慕课网APP

相关分类

Go
我要回答