5

通常要更改符号链接目标,首先将取消链接文件,然后使用新目标路径重新创建符号链接。但是,它将被分配一个新的 inode 编号。

也许有一个带有update_target_for_symlink()函数的私有Mac api,所以inode可以保持不变?

如果您想知道我需要它来做什么......文件管理器。我怀疑这根本不可能。无论如何,这就是让它变得有趣的原因。

4

3 回答 3

8

看起来这根本不可能。

于 2010-08-16T23:19:59.440 回答
2

链接是与 inode 关联的附加名称。因此,不可能重新定位链接,因为链接不是针对文件的唯一对象。它更像是文件的次要名称。

这就是为什么您必须首先取消链接(删除与文件关联的名称),然后为新文件创建一个新链接(添加一个附加名称)。

链接的inode不属于链接,属于文件。一个文件由名称列表(“链接”)、一个标识符(inode)和一堆包含文件内容的数据块组成。

符号链接应该可以重命名,因为它仅指文件的文本名称。

来自手册:有九个系统调用不跟随链接,它们对符号链接本身进行操作。它们是:lchflags(2)、lchmod(2)、lchown(2)、lstat(2)、lutimes(2)、readlink(2)、rename(2)、rmdir(2) 和 unlink(2)。

于 2010-08-20T13:32:00.537 回答
2

仔细观察, ln -sf 似乎做了你想做的事。

第一列是 inode 编号。注意它不会改变:

$ ln -s foo bar
$ ls -li bar
    16503 lrwxrwxrwx 1 golemon golemon 3 2010-08-21 12:29 bar -> foo
$ ln -sf buz bar
$ ls -li bar
    16503 lrwxrwxrwx 1 golemon golemon 3 2010-08-21 12:29 bar -> buz

看起来 ln-sf 简单地使用 unlink() 和 symlink() 来完成此操作:

$ strace ln -sf quux bar
    <snip>
    symlink("quux", "bar")                  = -1 EEXIST (File exists)
    unlink("bar")                           = 0
    symlink("quux", "bar")                  = 0

$ ls -li bar
    16503 lrwxrwxrwx 1 golemon golemon 4 2010-08-21 12:31 bar -> quux
于 2010-08-21T19:33:45.303 回答