亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

遞歸創建具有特定所有者和組的目錄

遞歸創建具有特定所有者和組的目錄

Go
HUH函數 2021-11-15 16:49:20
我想遞歸地創建一個目錄并為創建的文件夾及其父級分配一個所有者和組。例如,假設/var存在,我想創建/var/test1/test2/test3.我可以使用os.MkdirAll("/var/test1/test2/test3", 0600).不過,我也想一套test1,test2和test3的uid來user1和gid到user1??梢允褂?來做到這一點os.Chown,但這需要大量的手動工作。在創建文件夾鏈之前,我需要構建一個不存在的文件夾樹及其父文件夾,然后os.Chown在創建后在每個文件夾上使用。有沒有更簡單的方法?
查看完整描述

2 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

有點像這種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()這里不應該涉及太多的“手工工作”。


查看完整回答
反對 回復 2021-11-15
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

將 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 應該只是您的解決方案。


查看完整回答
反對 回復 2021-11-15
  • 2 回答
  • 0 關注
  • 206 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號