指向已存在目录的符号链接

指向已存在目录的符号链接

考虑到目标已经存在,是否有适当的方法来链接/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

  1. 首先手动删除目标。这应该在 Linux 和 Mac 上一致有效。

    rm "$target"
    ln -s "$source" "$target"
    
  2. 如果您使用的是 Linux,则可以使用该-T选项。

    ln -sT "$source" "$target"
    
  3. 如果您使用的是 macOS,则可以使用该-F选项。

    ln -sF "$source" "$target"
    

相关内容