如何在保留inode的情况下更改符号链接目标

5

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

也许有一个私有的Mac api,其中包含一个update_target_for_symlink()函数,因此inode可以保持不变?

如果你想知道我需要它做什么...那就是一个文件管理器。我怀疑这根本不可能。无论如何,这正是使它有趣的地方。

3个回答

8

看起来这似乎完全不可能。


是的,那正是问题所在 :-) - neoneye

2
一个链接是与inode相关联的另一个名称。因此,由于链接不是针对文件的唯一对象,所以没有可能重新定位链接。它更像是文件的第二个名称。
这就是为什么您首先必须取消链接(删除与文件相关联的名称),然后再创建新链接(添加其他名称)到新文件中。
链接的inode不属于链接,而属于文件。文件由名称列表(“链接”)、标识符(inode)和包含文件内容的一堆数据块组成。
符号链接应该可以重命名,因为它只涉及文件的文本名称。
根据手册:有九个系统调用不遵循链接,并且它们操作符号链接本身。它们是:lchflags(2)、lchmod(2)、lchown(2)、lstat(2)、lutimes(2)、readlink(2)、rename(2)、rmdir(2)和unlink(2)。

2
第一部分对于硬链接是正确的,但对于符号链接来说更或多或少是无关紧要的,因为OP正在询问符号链接。 - BCS

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

1
我感觉好像有什么东西漏掉了,因为@neoneye听起来好像已经尝试过这个方法,而且这似乎完全与@UnixShadow所说的相矛盾。 - bukzor
1
我看到你得到了相同的inode。这真的很有趣。然而,当我尝试相同的时候,我得到不同的inode。我猜你不在Mac上。你在哪个平台上? - neoneye
如果foo是一个目录,你需要使用ln -snf buz bar - vilpan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接