Answers:
您可以创建一个新的符号链接并将其移动到旧链接的位置。
ln -s <new_location> npm2
mv -f npm2 npm
这样可以保留链接所有权。或者,您可以使用chown
手动设置链接的所有权。
chown -h myuser:myuser npm
在大多数系统上,符号链接权限无关紧要。使用符号链接时,将检查符号链接目标组件的权限。但是,在某些系统上,它们确实很重要。MacOS要求对的链接具有读取权限readlink
,而NetBSD的symperm
mount选项会强制对读取和遍历进行链接权限检查。在那些系统(及其亲戚,包括FreeBSD和OpenBSD)上,有一个等效的-h
选项chmod
。
chmod -h 777 npm
当您尝试用于chmod
设置链接的权限时,实际上您实际上是在设置链接目标的权限。链接的权限是没有意义的。
test
有-rw-rw-r-- root root
,为rm test
我收到提示rm: remove write-protected regular empty file 'test'?
的解决方案是将目录中的敏感文件对哪些用户有只读访问。
当您有如下链接时:
link -> foo/bar
并希望将其更改为:
link -> new/target
有两种情况需要考虑:
foo/bar
不是目录,或者不存在,或者您没有对的搜索权限foo
。然后
ln -s new/target link
会因为link
已经存在而失败,但是您可以使用标准来解决:
ln -fs new/target link
foo/bar
是目录(并且您具有搜索权限foo
才能确定它foo/bar
是目录)。在这种情况下,当您执行以下操作:
ln -s new/target link
要么
ln -fs new/target link
这可以理解为target
在link
目录内创建一个新的符号链接(link
之所以称为目录,是因为它是该目录的符号链接foo/bar
)。因此,您实际上将创建一个:
foo/bar/target -> new/target
为了克服这个问题,GNU ln
提供了一个-T
选项,即始终将链接名视为链接名,而不是在其中创建链接的目录。因此,使用GNU ln
:
ln -fsT new/target link
将工作。和以前一样,它将删除原始link
符号链接并重新创建它,并将其new/target
作为目标(并以进程的euid和egid作为所有者)。
GNU ln
也有一个-n
选择。它的工作方式类似于,-T
除非当link
实际上是一个真实目录时,在这种情况下,它将仍然在该目录中创建符号链接(而不是由于错误而失败)。
可移植地,最好的选择是先删除链接,然后重新创建它:
rm -f link && ln -s new/target link
在大多数系统上,符号链接的权限将被忽略,并且通常固定为rwxrwxrwx
。
在符号链接权限很重要的系统上(例如OS / X,您需要对符号链接具有读取权限才能解析其目标),通常有一种更改它们的方法(chmod -h
在OS / X上)。
所有权虽然与上面所述对大多数系统上的符号链接所指向的文件的访问无关,但与父目录或配额的t
位可能还有其他相关性...),并且有一个标准命令可以更改它:
chown -h user[:group] the-link
chgrp -h group the-link
如果您确实需要更改符号链接权限(通常无意义,如在其他答案中所写),则可以成功使用以下-R
选项chown
:
chown -R myuser:mygroup link
如果-R
未使用,则权限未更改。
chown
因为它-R
暗示了-P
这一点,但是并不能保证,也不能在其他chown实现中使用。更改符号链接所有权的标准方法是使用该-h
选项。我刚刚更新了接受的答案,这是不正确的。