在 bash 中使用两个相对路径创建符号链接

在 bash 中使用两个相对路径创建符号链接

我的家里有两个目录:~/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

您可以执行以下任一操作

  1. 使用绝对路径

    $ ln -s ~/dir1/file.txt ~/dir2
    $ readlink dir2/file.txt 
    /home/terdon/dir1/file.txt
    
  2. 使用正确的相对路径

    $ ln -s ../dir1/file.txt dir2/
    $ readlink dir2/file.txt 
    ../dir1/file.txt
    

根据您的使用情况,其中一个可能比另一个更好。只需记住,在使用相对路径创建链接时,路径必须与目标相关而不是您的当前位置。

答案2

你的问题有点令人困惑。

  1. 你问“有什么办法可以从~/dir1[...] 建立到它的符号链接吗?”~/dir2根据您帖子的其余部分, 我想您的意思是“来自”?

  2. 你的第一个命令

    $ 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

  3. 您的第二个命令失败,因为没有目录../dir2可以放置符号链接,这就是错误消息的含义。

  4. 回答你的问题,是的。操作系统不关心你的符号链接是否指向没有有效文件系统对象的路径。

也许你真正想要的是

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)

编辑

澄清和建议阅读。

相关内容