解决Go中的符号链接问题

mna*_*gel 4 symlink go

如何在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

请参阅filepath.EvalSymlinks().

在评估任何符号链接后,EvalSymlinks返回路径名.如果path是相对的,则结果将相对于当前目录,除非其中一个组件是绝对符号链接.

例子

树:

/bin/sh -> bash
/usr/lib/libresolv.so -> ../../lib/libresolv.so.2
Run Code Online (Sandbox Code Playgroud)

os.Readlink()

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.