考虑到目标已经存在,是否有适当的方法来链接/home/user/app/public
到?/home/user/public_html
如果我这么做了ln -s /home/user/app/public /home/user/public_html
,我最终会拥有/home/user/public_html/public
。
我猜想也可能可以逆转这一动作,例如ln -s /home/user/public_html /home/user/app/public
,但我不确定如何避免/home/user/app/public/public_html
最终结果。
答案1
让我正确理解你的问题
您的来源是/home/user/public_html
,我假设其中有文件。您想在 中直接创建指向此目录的链接/home/user/app/public
。这样,您就可以执行类似操作ls /home/user/app/public
,并查看 上存在的文件/home/user/public_html
。
如果这是正确的,那么您的源是/home/user/public_html
,目标是/home/user/app/public
。正确的命令是这个:
ln -s /home/user/public_html /home/user/app/public
只需确保/home/user/app/public
之前输入的命令不是一个有效的目录或文件。
答案2
如果我理解正确的话,你想知道如何处理已经存在的目标。如果是这样的话,有两种可能的情况。
1) 现有目标是文件。如果是这种情况,您可以使用“-f”强制创建符号链接
2) 现有目标是目录。如果是这种情况,则取决于您当前对 ln 命令的实现。它可以有“-n”参数可用,这会导致目录的符号链接被正确处理,而不是像你所说的那样复制它们。
参考:https://unix.stackexchange.com/questions/207294/create-symlink-overwrite-if-one-exists
答案3
我不会对此进行详细的讨论,因为正确答案已经被选出,但ln
这样做根本行不通。
另一种解决方案是使用mount
而不是ln
。我认为在这种情况下正确的命令应该是:
sudo mount --bind ~/app/public ~/public_html
但是请注意这样做的注意事项:根据我的经验,这mount
需要特权,因此您必须sudo
这样做。因此,您不能将其放入,.profile
因为这会锁定您的会话。您可以将其放入脚本中,也可以将其添加到/etc/fstab
。我通常不会将绑定挂载添加到fstab
,但我相信条目应该是:
/home/user/app/public /home/user/public_html none defaults,bind 0 0
或类似的东西。我还非常确定您不能在 中使用相对路径fstab
,因此路径必须是绝对的,正如我在此处所示。
答案4
正如@jotadepicas 和@Milkmannetje 在评论中提到的,有几种方法可以解决这个问题。
假设您的源是$source
,目的地是$target
。
首先手动删除目标。这应该在 Linux 和 Mac 上一致有效。
rm "$target" ln -s "$source" "$target"
如果您使用的是 Linux,则可以使用该
-T
选项。ln -sT "$source" "$target"
如果您使用的是 macOS,则可以使用该
-F
选项。ln -sF "$source" "$target"