如何在Go中解决符号链接?
目前我打电话readlink -f但我想要一些更惯用的东西.
package main
import (
"os/exec"
"fmt"
)
func resolve(p string) string {
cmd := exec.Command("readlink", "-f", p)
out, _ := cmd.Output()
return (string(out))
}
func main() {
fmt.Printf(resolve("/initrd.img"))
}
Run Code Online (Sandbox Code Playgroud)
Iva*_*ack 12
在评估任何符号链接后,EvalSymlinks返回路径名.如果path是相对的,则结果将相对于当前目录,除非其中一个组件是绝对符号链接.
树:
/bin/sh -> bash
/usr/lib/libresolv.so -> ../../lib/libresolv.so.2
Run Code Online (Sandbox Code Playgroud)
os.Readlink("/bin/sh") // => bash
os.Readlink("/usr/lib/libresolv.so") //=> ../../lib/libresolv.so.2
Run Code Online (Sandbox Code Playgroud)
filepath.EvalSymlinks()
filepath.EvalSymlinks("/bin/sh") // => /bin/bash
filepath.EvalSymlinks("/usr/lib/libresolv.so") //=> /lib/libresolv-2.20.so
Run Code Online (Sandbox Code Playgroud)
注意:不是绝对路径(cd /bin)
filepath.EvalSymlinks("sh") // => bash
filepath.EvalSymlinks("/bin/sh") // => /bin/bash
Run Code Online (Sandbox Code Playgroud)
还有更多
filepath.EvalSymlinks("/bin/bash") // => /bin/bash
// but
os.Readlink("/bin/bash") // => error: readlink /bin/bash: invalid argument
Run Code Online (Sandbox Code Playgroud)
示例应用不适用于游乐场
zzz*_*zzz 11
使用os.Lstat:
func Lstat(name string) (fi FileInfo, err error)
Run Code Online (Sandbox Code Playgroud)
Lstat返回描述命名文件的FileInfo.如果文件是符号链接,则返回的FileInfo描述符号链接.Lstat不会尝试关注该链接.如果有错误,则其类型为*PathError.
编辑:
然后返回os.FileInfo只允许您检查'name'是否是链接(fi.Mode() & os.ModeSymlink != 0).如果是,则使用os.Readlink获取指针:
func Readlink(name string) (string, error)
Run Code Online (Sandbox Code Playgroud)
Readlink返回指定符号链接的目标.如果有错误,则其类型为*PathError.