как изменить цель символической ссылки при сохранении inode - PullRequest
5 голосов
/ 28 июля 2010

Обычно для изменения цели символической ссылки сначала нужно отсоединить файл, а затем заново создать символическую ссылку с новым целевым путем. Однако ему будет присвоен новый номер инода.

Может быть, есть частный api Mac с функцией update_target_for_symlink(), поэтому индекс может остаться прежним?

На случай, если вам интересно, для чего мне это нужно ... файловый менеджер. Я сомневаюсь, что это возможно вообще. В любом случае это то, что делает его интересным.

Ответы [ 3 ]

8 голосов
/ 17 августа 2010

Похоже, это вообще невозможно.

2 голосов
/ 21 августа 2010

Если присмотреться, 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
2 голосов
/ 20 августа 2010

Ссылка - это дополнительное имя, связанное с индексом. Таким образом, нет возможности перенаправить ссылку, поскольку ссылка не является уникальным объектом, нацеленным на файл. Это скорее вторичное имя файла.

Именно поэтому сначала необходимо отсоединить его (удалить имя, связанное с файлом), а затем создать новую ссылку (добавить дополнительное имя) к новому файлу.

Индод ссылки не принадлежит ссылке, он принадлежит файлу. Файл состоит из списка имен («ссылок»), идентификатора (inode) и набора блоков данных, содержащих содержимое файла.

Символьную ссылку можно переименовать, поскольку она относится только к текстовому имени файла.

Из руководства: существует девять системных вызовов, которые не переходят по ссылкам и работают с самой символической ссылкой. Это lchflags (2), lchmod (2), lchown (2), lstat (2), lutimes (2), readlink (2), rename (2), rmdir (2) и unlink (2).

...