如何更新符号链接目标(ln -f -s不工作)

我在用着

ln -f -s / var / www / html / releases / build1390 app-current

用新的目的地更新符号链接“app-current”。 但是,这不起作用,链接“应用程序当前”保持原来的目的地,但是,我没有得到任何错误…

我宁愿不删除链接并重新创build它,只需更新现有链接的目标。 那可能吗?

    这对我strace ln -f -s /var/www/html/releases/build1390 app-currentstrace ln -f -s /var/www/html/releases/build1390 app-current什么?

    哦,因为它是一个目录,你需要添加-n没有取消引用,这应该解决这个问题。 -f实际上更加方便,因为添加-f只是导致它无法链接。 虽然我想在正常加载的系统上可能会发生几百毫秒的速度。

    例如,如果arf已经指向/ home:

    strace With -n

     strace ln -n -f -s / arf ... symlink("/", "arf") = -1 EEXIST (File exists) unlink("arf") = 0 symlink("/", "arf") = 0 

    strace没有-n

     strace ln -f -s / arf ... write(2, "ln: "..., 4ln: ) = 4 write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34 write(2, "\n"..., 1) = 1 

    因此,如果没有-n arf被取消引用,那么就把它看作是arf,就好像它实际上是/ 。 在你的特定例子中,如果没有错误,我认为你可能已经在/var/www/html/releases/build1390 app-current创build了一个新的符号链接,并且希望清除它。

    如果是符号链接,可以使用-n--no-dereference来防止目标被解引用。 您还可以使用-T--no-target-directory来确保目标文件将始终被视为常规文件。

    这些产生稍微不同的行为,如以下示例所示。 假设src是一个文件, dirlink是一个目录的符号链接,而dir是一个实际的目录。

    使用-n

    • ln -sfn src dirlink覆盖dirlink并将其链接到src
    • ln -sfn src dir创build链接dir/src -> src

    使用-T

    • ln -sfT src dirlink覆盖dirlink并将其链接到src
    • ln -sfT src dir产生一个错误信息: ln: 'dir': cannot overwrite directory