如何在保留inode的同时更改符号链接目标

时间:2010-07-28 00:48:19

标签: macos symlink inode unlink

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

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

如果你想知道我需要它...文件管理器。我怀疑这是否可能。无论如何这就是它的有趣之处。

3 个答案:

答案 0 :(得分:8)

看起来很像这根本不可能。

答案 1 :(得分:2)

链接是与inode关联的附加名称。因此,链接不是针对文件的唯一对象,因此无法重新定位链接。它更像是文件的辅助名称。

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

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

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

来自手册:有九个系统调用不遵循链接,并且在符号链接本身上运行。它们是:lchflags(2),lchmod(2),lchown(2),lstat(2),lutimes(2),readlink(2),rename(2),rmdir(2)和unlink(2)。< / p>

答案 2 :(得分: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