【问题标题】:Cannot overwrite Symbolic Link RedHat Linux无法覆盖符号链接 RedHat Linux
【发布时间】:2011-07-12 03:26:07
【问题描述】:

我创建了一个符号链接:

sudo ln -s /some/dir new_dir

现在我想覆盖符号链接以指向一个新的位置,它不会覆盖。我试过了:

sudo ln -f -s /other/dir new_dir

我总是可以sudo rm new_dir,但如果可能的话,我宁愿让它相应地覆盖。有什么想法吗?

【问题讨论】:

    标签: linux symlink redhat


    【解决方案1】:
    ln -sfn /other/dir new_dir
    

    为我工作。 -n 不会取消引用目标符号链接。

    【讨论】:

    • 好点。来自手册页:-h If the target_file or target_dir is a symbolic link, do not follow it. This is most useful with the -f option, to replace a symlink which may point to a directory.
    • -n 等价于-h(至少在 MacOS X 上)
    【解决方案2】:

    您可以创建它然后移动它:

    sudo ln -f -s /other/dir __new_dir
    sudo mv -Tf __new_dir new_dir
    

    edit:缺少-Tf,将目录视为常规文件,不提示覆盖。

    这样你会覆盖它。

    【讨论】:

      【解决方案3】:

      由于来自 mikeytown2s 评论的链接被破坏,我将解释为什么 redent84s answer 更好:

      虽然

      ln -sfn newDir currentDir
      

      完成这项工作,它不是原子操作,正如您可以通过 strace 看到的那样:

      $ strace ln -snf newDir currentDir 2>&1 | grep link
      unlink("currentDir")         = 0
      symlink("newDir", "currentDir") = 0
      

      当您有一个指向该符号链接的网络服务器根目录时,这一点很重要。当符号链接被删除并重新创建时,它可能会导致错误 - 即使在微秒的时间跨度内。

      为了防止错误,请改用:

      $ ln -s newDir tmpCurrentDir && mv -Tf tmpCurrentDir currentDir
      

      这将创建一个临时链接,然后在原子操作中覆盖 currentDir

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        相关资源
        最近更新 更多