如何在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"))
}
答案 0 :(得分:11)
EvalSymlinks在评估任何符号链接后返回路径名。如果path是相对的,则结果将相对于当前目录,除非其中一个组件是绝对符号链接。
树:
/bin/sh -> bash
/usr/lib/libresolv.so -> ../../lib/libresolv.so.2
os.Readlink("/bin/sh") // => bash
os.Readlink("/usr/lib/libresolv.so") //=> ../../lib/libresolv.so.2
filepath.EvalSymlinks()
filepath.EvalSymlinks("/bin/sh") // => /bin/bash
filepath.EvalSymlinks("/usr/lib/libresolv.so") //=> /lib/libresolv-2.20.so
注意:不是绝对路径(cd /bin
)
filepath.EvalSymlinks("sh") // => bash
filepath.EvalSymlinks("/bin/sh") // => /bin/bash
更多的东西
filepath.EvalSymlinks("/bin/bash") // => /bin/bash
// but
os.Readlink("/bin/bash") // => error: readlink /bin/bash: invalid argument
Example application不适合游乐场
答案 1 :(得分:8)
使用os.Lstat:
func Lstat(name string) (fi FileInfo, err error)
Lstat返回描述指定文件的FileInfo。如果文件是符号链接,则返回的FileInfo描述符号链接。 Lstat不会尝试关注该链接。如果有错误,则其类型为* PathError。
编辑:
然后返回os.FileInfo
只会让您检查'name'是否为链接(fi.Mode() & os.ModeSymlink != 0
)。如果是,则使用os.Readlink获取指针:
func Readlink(name string) (string, error)
Readlink返回指定符号链接的目标。如果有错误,则其类型为* PathError。