2010-07-28 70 views
5

通常要更改符号链接目标,首先会断开文件链接,然后使用新的目标路径重新创建符号链接。但是它将被分配一个新的inode号码。如何在保留inode的情况下更改符号链接目标

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

如果你想知道我需要什么..文件管理器。我怀疑这是可能的。无论如何,这是什么使它有趣。

回答

7

它看起来很像这是不可能的。

+0

是啊,这是:-) – neoneye 2010-08-17 21:50:46

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 2010-08-23 04:28:04

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只是使用断开链接()和符号链接()来实现:

$ 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 2010-08-21 19:38:05

+1

我看到你得到相同的inode。这真的很有趣。不过,当我尝试相同的时候,我会得到不同的inode。我想你没有在Mac上。你在哪个平台上? – neoneye 2010-08-22 03:11:53

+0

如果您在其中执行其他操作,它会工作吗? – BCS 2010-08-23 04:31:35

相关问题