目前基于测试结果得到结论,暂时无权威资料显示出原因
参考了 https://blog.csdn.net/weixin_42183399/article/details/80498750
但是这个博客给的结果只是特殊用法,无法归结至一般结论
下面开始正式介绍
文件及目录说明
/home/
/home/xxx.txt
/home/source/
/home/source/aaa.txt --想要创建软链接的源文件
/home/source/ln.sh --执行软链接命令的脚本
/home/source/file
/home/source/file/file2
/home/source/linkresult
/home/file/
名词解释
相对路径写法的深度
../bbb.txt 深度为1层
file/ 深度为1层
../file/ 深度为2层
../file/bbb.txt 深度为2层
深度=/的个数
ln -s [源路径] [目标路径]
规则一:
使用相对路径时,目标路径能够获取的层次不超过执行脚本所在的目录层次,也就是说目标相对路径不可使用..
规则二:
目标路径如果想对目标路径使用多层文件夹的形式创建链接,则源路径必须带..
依旧使用上面的aaa.txt创建软链接
采用命令 ln -s aaa.txt bbb.txt,成功创建
采用命令 ln -s aaa.txt file/bbb.txt 一定失败
采用命令 ln -s aaa.txt file/bbb.txt 一定失败
采用命令 ln -s aaa.txt file/file2/bbb.txt 一定失败
也就是说,源路径没有..,目标路径只能是以脚本所在目录为基准,无法获取更深层目录
采用 ln -s ../aaa.txt file/bbb.txt 一定成功
但是 再采用 ln -s ../aaa.txt bbb.txt 一定失败
但是 再采用 ln -s ../aaa.txt ../bbb.txt 一定失败(违反规则一)
而采用 ln -s ../aaa.txt file/bbb.txt成功,则涉及到另一个机制了
aaa.txt和准备执行的脚本/home/source/ln.sh是同一个目录,那么对原路径采用../aaa.txt 与 aaa.txt有何区别?
规则三:
源路径中".."的总数量 - ".."能够正常索引到对应文件的数量=目标相对路径写法必须使用的深度
这时候aaa.txt与脚本路径已经相同,".."能够正常索引到对应文件的数量 = 0,".."的数量 = 1,差值为1,则目标文件夹的深度必须为一层
所以采用命令 ln -s aaa.txt bbb.txt,成功创建,ln -s ../aaa.txt file/bbb.txt 成功,并且ln -s ../aaa.txt bbb.txt失败(目标相对路径写法的深度为0层,而不是1层)
同理ln -s ../../aaa.txt file/file2/bbb.txt 成功(多出了两组..,则目标相对路径写法的深度必须为二层,且不可为其他层次,例如一层,零层)
继续,对脚本的上层目录的文件进行软连接
ln -s ../xxx.txt yyy.txt 成功
这里..是正常搜索目录,所以多出0组,则目标文件夹深度必须0层
如果尝试更深深度 ln -s ../xxx.txt file/yyy.txt 失败
尝试更深深度 ln -s ../xxx.txt file/file2/yyy.txt 失败
正确做法,增加..
ln -s ../../xxx.txt file/yyy.txt,因为..多出1组(../xxx.txt正常搜索到xxx.txt(1组..),..总数量为2,得到2-1=1),所以目标相对路径写法的深度必须为1层,不可为其他层次
规则四:
"文件夹名/文件名" 等同于 "文件夹名/" (因为深度相同)
但使用"文件夹名/" 时 在目标路径生成的软链接的名字同源路径的文件名或文件夹名
例如"ln -s ../aaa.txt file/" ,则会在/home/file目录下生成名为aaa.txt的软链接
"ln -s ../aaa.txt file/bbb.txt" ,则会在/home/file目录下生成名为bbb.txt的软链接
规则五:
对文件夹进行软链接,同上述规则(测试下面指令时,同名的软链接记得需要先删除旧的,否则提示file exit)
ln -s file filecopy 成功
ln -s ../file linkresult/filecopy 成功
ln -s ../file linkresult/ 成功
ln -s ../source filecopy 成功
ln -s ../../source linkresult/filecopy 成功
ln -s ../../source linkresult/ 成功
经过这么多规则后,如果没有必要,建议建软链接时源路径采用绝对路径的写法,目标路径相对绝对都可以,真的省心省事(不受规则一二三限制)
目标路径相对路径写法
ln -s /home/source/aaa.txt bbb.txt 成功
ln -s /home/source/aaa.txt ../bbb.txt 成功(我可以到脚本上级目录,甚至是通过..到任意目录都可以)
目标路径相对绝对写法
ln -s /home/source/aaa.txt home/bbb.txt 成功
ln -s /home/source/aaa.txt home/ 成功
ln -s /home/source/aaa.txt /home/source/file/file2 成功