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

Macos 如何在保留inode的同时更改符号链接目标,macos,symlink,inode,unlink,Macos,Symlink,Inode,Unlink,通常,要更改符号链接目标,将首先取消文件链接,然后使用新的目标路径重新创建符号链接。但是,它将被分配一个新的索引节点号 也许有一个私有的Mac api,它有一个update\u target\u for\u symlink()函数,这样inode就可以保持不变了 万一你想知道我需要它做什么。。文件管理器。我怀疑这是否可能。无论如何,这就是它的有趣之处。看起来这根本不可能。链接是与inode关联的附加名称。因此,不可能重定链接的目标,因为链接不是指向文件的唯一对象。它更像是一个文件的次要名称 这就

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

也许有一个私有的Mac api,它有一个
update\u target\u for\u symlink()
函数,这样inode就可以保持不变了


万一你想知道我需要它做什么。。文件管理器。我怀疑这是否可能。无论如何,这就是它的有趣之处。

看起来这根本不可能。

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

这就是为什么必须首先取消链接(删除与文件关联的名称),然后创建新链接(添加其他名称)到新文件的原因

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

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


来自手动:有九个系统调用不遵循链接,并且在符号链接本身上操作。它们是:lchflags(2)、lchmod(2)、lchown(2)、lstat(2)、lutimes(2)、readlink(2)、rename(2)、rmdir(2)和unlink(2)。

仔细一看,ln-sf似乎做了你想做的事情

第一列是索引节点编号。注意,它不会改变:

$ 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
$strace ln-sf qux条
符号链接(“quux”、“bar”)=-1 EEXIST(文件存在)
取消链接(“条”)=0
符号链接(“quux”、“bar”)=0
$ls-li酒吧
16503 lrwxrwxrwx 1戈莱蒙戈莱蒙4 2010-08-21 12:31巴

是的,这正是问题所在:-)我觉得我遗漏了一些东西,因为@neoneye听起来好像已经尝试过了,这似乎与@UnixShadow所说的完全相反。我看到你也得到了同样的inode。这真的很有趣。然而,当我尝试同样的方法时,我会得到不同的索引节点。我猜你不在Mac上。你在哪个平台上?如果foo是一个目录,你需要
ln-snf buz bar
。第一部分对于硬链接是正确的,但或多或少与OP询问symlink无关。