有没有办法编辑符号链接而不先删除它?

时间:2009-11-13 05:22:00

标签: unix symlink

所以我创建了一个符号链接:

ln -s /location/to/link linkname

现在我想更改符号链接所链接的位置。我怎么做?有没有办法不先删除它?

10 个答案:

答案 0 :(得分:39)

您可以使用其他名称创建新链接,然后移动它以替换旧链接。

ln -s /location/to/link linkname

后来

ln -s /location/to/link2 newlink
mv newlink linkname

如果newlinklinkname位于同一物理设备上,mv应该是原子的。

答案 1 :(得分:24)

尝试ln -sf new_destination linkname

答案 2 :(得分:17)

如果符号链接目标是目录,则需要将-T标志添加到mv命令,否则它会将新符号链接移动到旧符号链接的目标目录。

将网站自动切换到新版本的示例:

原始设置 - 网站存储在www1目录中,vhost指向www符号链接:

ln -s www1 www

浏览网站,查看旧版本。

将新网站文件放入新的www2目录。

为新网站设置新的符号链接:

ln -s www_new www2

www符号链接移动到新网站的目录:

mv -T www_new www

浏览网站,立即查看新版本。

答案 3 :(得分:14)

只需更改符号链接目标:

# ln -sfT /path/to/new/target linkname

这是一个瞬间的原子变化。

答案 4 :(得分:7)

对于目录,您希望这样做: ln -sfT / location / to / new / target old_linkname

答案 5 :(得分:6)

在OSX上,ln的手册页说你可以这样做

ln -shf /location/to/link link name

从手册页:

The options are as follows:
 -F    If the target file already exists and is a directory, then remove it so that the link may occur.  The -F
       option should be used with either -f or -i options.  If none is specified, -f is implied.  The -F option is
       a no-op unless -s option is specified.

 -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.

 -f    If the target file already exists, then unlink it so that the link may occur.  (The -f option overrides any
       previous -i options.)

 -i    Cause ln to write a prompt to standard error if the target file exists.  If the response from the standard
       input begins with the character `y' or `Y', then unlink the target file so that the link may occur.  Other-
       wise, do not attempt the link.  (The -i option overrides any previous -f options.)

 -n    Same as -h, for compatibility with other ln implementations.

 -s    Create a symbolic link.

 -v    Cause ln to be verbose, showing files as they are processed.

答案 6 :(得分:5)

没有。如果newpath已存在,则symlink系统调用将返回EEXIST。您只能从文件系统中的新节点进行链接。这里有什么要求?如果由于unlink / symlink调用的非原子性而担心竞争,那么您可能需要重新考虑该体系结构以在其他地方提供同步。这种事情引入了一些可怕的安全漏洞。

答案 7 :(得分:4)

链接这样的命令:

rm currentlink && ln -s /path/to/link currentlink

第一个命令删除现有命令,第二个命令立即再次创建它。

答案 8 :(得分:3)

正如其他人所提到的,您基本上必须首先删除符号链接,手动删除或将-f标记传递给ln实用程序。

多年前,我不得不经常对符号链接进行小编辑,所以我写了一个简单的基于readline的实用程序(edln)来减少烦恼。如果其他人发现它有用,我已将其置于https://github.com/jjlin/edln/

edln将显示原始符号链接目标;然后,您可以使用箭头键或标准的readline键击(M-bM-fC-d等)来移动并编辑目标。

答案 9 :(得分:0)

只是谷歌搜索,找不到好的答案,不得不解决自己:

ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary

按定义编辑意味着不从头开始重新创建,而是部分更改。任何需要记住路径的答案,可能很长或带有奇怪的符号,都是不好的。