В стандартной библиотеке golang есть функции os.Chown() и os.Chmod(). Однако на вход они получают путь к файлу и работают не рекурсивно. Самым простым способом сделать рекурсивное изменение владельца, группы и прав доступа в файлу — объявить свои функции:
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
})
}
func ChmodR(path string, mode os.FileMode) error {
return filepath.Walk(path, func(name string, info os.FileInfo, err error) error {
if err == nil {
err = os.Chmod(name, mode)
}
return err
})
}
Но если вы не ищите лёгких путей, то можете вызвать специально предназначенные для этого функции операционной системы:
func ChownR(path string, uid, gid int) error {
cmd := exec.Command("chown", uid + ":" + gid, "-R", path)
return cmd.Run()
}
func ChmodR(path string, mode os.FileMode) error {
cmd := exec.Command("chmod", mode.String(), "-R", path)
return cmd.Run()
}
Однако такое решение может оказаться не кроссплатформенным.