解决Go中的符号链接问题

时间:2013-08-05 15:33:02

标签: go symlink

如何在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"))
}

2 个答案:

答案 0 :(得分:11)

请参阅filepath.EvalSymlinks()

  

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

实施例

树:

/bin/sh -> bash
/usr/lib/libresolv.so -> ../../lib/libresolv.so.2

os.Readlink()

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。