所以我创建了一个符号链接:
ln -s /location/to/link linkname
现在我想更改符号链接所链接的位置。我怎么做?有没有办法不先删除它?
答案 0 :(得分:39)
您可以使用其他名称创建新链接,然后移动它以替换旧链接。
ln -s /location/to/link linkname
后来
ln -s /location/to/link2 newlink
mv newlink linkname
如果newlink
和linkname
位于同一物理设备上,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-b
,M-f
,C-d
等)来移动并编辑目标。
答案 9 :(得分:0)
只是谷歌搜索,找不到好的答案,不得不解决自己:
ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary
按定义编辑意味着不从头开始重新创建,而是部分更改。任何需要记住路径的答案,可能很长或带有奇怪的符号,都是不好的。