ln -s 是否要求您位于某个目录中?

ln -s 是否要求您位于某个目录中?

我想创建一个指向文件的简单符号链接。

如果我从想要创建符号链接的目录内部运行命令,它可以完美运行:

/path/to/link $ ln -s /path/to/file .

但如果我位于任何其他目录中,它每次都会创建一个断开的链接:

/any/other/path $ ln -s /path/to/file /path/to/link

是否ln -s要求您进入某个目录,或者我遗漏了什么?运行 Ubuntu 10.04。

更新:抱歉,关于路径是相对路径还是绝对路径,您搞混了。它们是相对路径,正如一些人在回答中提到的,这就是我的问题的根源。谢谢!

答案1

如果您不与目标位于同一目录中,则必须确保使用绝对路径。

ln -s foo/bar baz/quux # fails

ln -s ~/foo/bar baz/quux # succeeds

答案2

我倾向于使用

ln -s $(pwd)/local_file /path/to/link

当我需要链接本地文件时。

答案3

这对我来说总是不合常理。我习惯这样做:

ln -s $(readlink -f /path/to/file) /path/to/link

它应该可以工作,但代价是使其与实际的磁盘链接不相关。

答案4

就其本身而言,它实际上与您所在的目录无关。它与您创建的符号链接有关:符号链接只是包含指向文件的路径的文件。您可以创建包含以字符开头的路径的符号链接,/也可以创建不以该字符开头的符号链接。您可以创建包含..路径组件的符号链接,也可以创建不包含路径组件的符号链接。当程序解析符号链接以查找目标文件时,它们会将路径解释为相对于包含符号链接的目录。因此,您只需要确保符号链接具有您想要的路径。

这是一种类似于 Matthew Flaschen 的答案的方法,但在这里相对的符号链接:

/tmp$ mkdir -p spam/eggs/ham
/tmp$ mkdir foo
/tmp$ python -c "import os, sys; print os.path.relpath(sys.argv[1], os.path.abspath(sys.argv[2])), sys.argv[2]" $(readlink -e foo) spam/eggs/ham  | xargs ln -s 
/tmp$ ls -l spam/eggs/ham/foo
lrwxrwxrwx 1 user user 12 2012-02-05 15:12 spam/eggs/ham/foo -> ../../../foo

毫无疑问,这也可以在纯 Bourne / bash shell 中完成,但在 python 中正确地编写(和读取)它很容易。

相关内容