我想创建一个指向文件的简单符号链接。
如果我从想要创建符号链接的目录内部运行命令,它可以完美运行:
/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 中正确地编写(和读取)它很容易。