通过 os 包创建相对符号链接

Posted

技术标签:

【中文标题】通过 os 包创建相对符号链接【英文标题】:Creating a relative symbolic link through the os package 【发布时间】:2016-02-21 20:25:57 【问题描述】:

我想使用 os 包在 go 中创建一个相对符号链接。

操作系统已经contains the function: os.SymLink(oldname, newname string),但它无法创建相对符号链接。

例如,如果我运行以下命令:

package main 

import (
    "io/ioutil"
    "os"
    "path/filepath"
)

func main() 
    path := "/tmp/rolfl/symexample"
    target := filepath.Join(path, "symtarget.txt")
    os.MkdirAll(path, 0755)
    ioutil.WriteFile(target, []byte("Hello\n"), 0644)
    symlink := filepath.Join(path, "symlink")
    os.Symlink(target, symlink)

它在我的文件系统中创建以下内容:

$ ls -la /tmp/rolfl/symexample
total 12
drwxr-xr-x 2 rolf rolf 4096 Feb 21 15:21 .
drwxr-xr-x 3 rolf rolf 4096 Feb 21 15:21 ..
lrwxrwxrwx 1 rolf rolf   35 Feb 21 15:21 symlink -> /tmp/rolfl/symexample/symtarget.txt
-rw-r--r-- 1 rolf rolf    6 Feb 21 15:21 symtarget.txt

如何使用 golang 创建如下所示的相对符号链接:

$ ln -s symtarget.txt symrelative
$ ls -la
total 12
drwxr-xr-x 2 rolf rolf 4096 Feb 21 15:23 .
drwxr-xr-x 3 rolf rolf 4096 Feb 21 15:21 ..
lrwxrwxrwx 1 rolf rolf   35 Feb 21 15:21 symlink -> /tmp/rolfl/symexample/symtarget.txt
lrwxrwxrwx 1 rolf rolf   13 Feb 21 15:23 symrelative -> symtarget.txt
-rw-r--r-- 1 rolf rolf    6 Feb 21 15:21 symtarget.txt

我想要类似上面symrelative 的东西。

我必须求助于os/exec:

cmd := exec.Command("ln", "-s", "symtarget.txt", "symlink")
cmd.Dir = "/tmp/rolfl/symexample"
cmd.CombinedOutput()

【问题讨论】:

【参考方案1】:

调用os.Symlink时不要包含symtarget.txt的绝对路径;仅在写入文件时使用它:

package main 

import (
    "io/ioutil"
    "os"
    "path/filepath"
)

func main() 
    path := "/tmp/rolfl/symexample"
    target := "symtarget.txt"
    os.MkdirAll(path, 0755)
    ioutil.WriteFile(filepath.Join(path, "symtarget.txt"), []byte("Hello\n"), 0644)
    symlink := filepath.Join(path, "symlink")
    os.Symlink(target, symlink)

【讨论】:

以上是关于通过 os 包创建相对符号链接的主要内容,如果未能解决你的问题,请参考以下文章

windows创建符号链接命令

windows创建符号链接命令

windows创建符号链接命令

强制 PHP 作曲家创建本地存储库的相对而非绝对符号链接

在带有符号链接的可执行文件中使用相对路径

如何通过覆盖现有符号链接来强制创建符号链接?