5

通常、シンボリックリンクターゲットを変更するには、最初にファイルのリンクを解除してから、新しいターゲットパスでシンボリックリンクを再作成します。ただし、新しいiノード番号が割り当てられます。

update_target_for_symlink()たぶん、関数を備えたプライベートMac APIがあるので、iノードは同じままでいられますか?

あなたが私がそれを何のために必要とするのか疑問に思う場合に備えて..ファイルマネージャ。私はこれがまったく可能であるとは思えません。とにかくそれが面白いのです。

4

3 に答える 3

8

これはまったく不可能なようです。

于 2010-08-16T23:19:59.440 に答える
2

リンクは、iノードに関連付けられた追加の名前です。したがって、リンクはファイルをターゲットとする一意のオブジェクトではないため、リンクを再ターゲットする可能性はありません。これは、ファイルの2番目の名前です。

そのため、最初にリンクを解除し(ファイルに関連付けられている名前を削除)、次に新しいファイルへの新しいリンクを作成(名前を追加)する必要があります。

リンクのiノードはリンクに属していません。ファイルに属しています。ファイルは、名前のリスト( "リンク")、識別子(inode)、およびファイルの内容を含むデータブロックの束で構成されます。

シンボリックリンクは、ファイルのテキスト名のみを参照するため、名前を変更できる必要があります。

マニュアルから:リンクをたどらず、シンボリックリンク自体を操作する9つのシステムコールがあります。それらは、lchflags(2)、lchmod(2)、lchown(2)、lstat(2)、lutimes(2)、readlink(2)、rename(2)、rmdir(2)、およびunlink(2)です。

于 2010-08-20T13:32:00.537 に答える
2

よく見ると、ln-sfはあなたが望むことをしているようです。

最初の列はiノード番号です。変更されないことに注意してください。

$ 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
于 2010-08-21T19:33:45.303 に答える