17

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"))
}
4

3 に答える 3

33

filepath.EvalSymlinks()を参照してください。

EvalSymlinks は、シンボリック リンクの評価後にパス名を返します。パスが相対パスの場合、コンポーネントの 1 つが絶対シンボリック リンクでない限り、結果は現在のディレクトリに対して相対パスになります。

木:

/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

ファイルパス.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

遊び場ではないアプリケーションの例

于 2015-01-31T06:47:23.837 に答える