【问题标题】:how to change symlink target while preserving inode如何在保留 inode 的同时更改符号链接目标
【发布时间】:2011-03-21 22:01:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: macos symlink inode unlink


    【解决方案1】:

    看起来这根本不可能。

    【讨论】:

    • 是的,这正是问题所在:-)
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 第一部分对于硬链接是正确的,但在 OP 询问符号链接时或多或少无关紧要。
    【解决方案3】:

    仔细观察, 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
    

    【讨论】:

    • 我觉得我错过了一些东西,因为@neoney 听起来他已经尝试过了,而且这似乎与@UnixShadow 所说的完全矛盾。
    • 我看到你得到了相同的 inode。这真的很有趣。但是,当我尝试相同时,我会得到不同的 inode。我猜你不在Mac上。你在哪个平台上?
    • 如果 foo 是一个目录,你需要ln -snf buz bar
    猜你喜欢
    • 2012-07-03
    • 2011-11-17
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2017-09-10
    • 2020-02-04
    相关资源
    最近更新 更多