我的家里有两个目录:~/dir1
并且~/dir2
第一个目录中有一个文件:~/dir1/file.txt
有什么方法可以让我~/dir2
不用移动到它而建立一个指向它的符号链接~/
,如果不行,为什么会这样?
我已经尝试过~/
跑步:
$ ln -s ./dir1/file.txt ./dir2/file.txt
但正如我所料,这会导致生成的符号链接有效指向~/dir1/dir2/file.txt
有意义的位置,但不是我真正想要的。
我也尝试过:
$ ln -s ./dir1/file.txt ../dir2/file.txt
返回:
ln: failed to create symbolic link `../dir2/file.txt': No such file or directory
我希望这只是创建一个~/dir2/file.txt
指向的符号链接~/../dir1/file.txt
所以我想我真正的问题是:我可以强制ln
建立一个指向它认为不存在的文件的符号链接吗?
编辑: 为了更加清楚地了解我想要实现的目标,我想要一个可以从我的主目录运行的命令,它可以有效地完成以下任务:
pushd dir2/ && ln -s ../dir1/file.txt && popd
或者用 Python (这是最接近我想要的):
echo "import os; os.symlink('../dir1/file.txt', './dir2/file.txt')" | python
答案1
您可以执行以下任一操作
使用绝对路径
$ ln -s ~/dir1/file.txt ~/dir2 $ readlink dir2/file.txt /home/terdon/dir1/file.txt
使用正确的相对路径
$ ln -s ../dir1/file.txt dir2/ $ readlink dir2/file.txt ../dir1/file.txt
根据您的使用情况,其中一个可能比另一个更好。只需记住,在使用相对路径创建链接时,路径必须与目标相关而不是您的当前位置。
答案2
你的问题有点令人困惑。
你问“有什么办法可以从
~/dir1
[...] 建立到它的符号链接吗?”~/dir2
根据您帖子的其余部分, 我想您的意思是“来自”?你的第一个命令
$ ln -s ./dir1/file.txt ./dir2/file.txt
并没有像你想象的那样执行操作。假设你仍在主目录中,上述命令会创建一个符号链接,其自身路径为
~/dir2/file.txt
,并且此符号链接指向字面上地到路径./dir1/file.txt
。由于所述符号链接位于目录中~/dir2
,因此该目标路径解析为~/dir2/./dir1/file.txt
,进一步解析为~/dir2/dir1/file.txt
(可能不存在并且不是您想要的)。所以我怀疑您为什么说它解析为~/dir1/dir2/file.txt
。您的第二个命令失败,因为没有目录
../dir2
可以放置符号链接,这就是错误消息的含义。回答你的问题,是的。操作系统不关心你的符号链接是否指向没有有效文件系统对象的路径。
也许你真正想要的是
ln -s ../dir1/file.txt ./dir2/file.txt
我猜是吧?此命令创建一个符号链接,其自身路径为./dir2/file.txt
,其目标是文字相对路径../dir1/file.txt
。符号链接指向的最终绝对路径是~/dir2/../dir1/file.txt
,解析为~/dir1/file.txt
。
请注意,该~
符号是 shell 可扩展字符,它扩展为主目录的绝对路径。 ~
-expansion 不是 OS 路径解析的一部分。
建议阅读
path_resolution(7)
、symlink(7)
和ln(1)
的Linux 手册页ln(1p)
。
编辑
澄清和建议阅读。