2010-07-28 5 views
5

Normalement, pour modifier une cible de lien symbolique, il faut d'abord dissocier le fichier puis recréer le lien symbolique avec le nouveau chemin cible. Cependant, un nouveau numéro d'inode lui sera attribué.comment modifier la cible du lien symbolique tout en préservant l'inode

Peut-être qu'il existe une API privée Mac avec une fonction update_target_for_symlink(), de sorte que l'inode peut rester le même? Dans le cas où vous vous demandez ce que j'ai besoin pour .. un gestionnaire de fichiers. Je doute que cela soit possible du tout. Quoi qu'il en soit, c'est ce qui le rend intéressant.

Répondre

7

Cela ressemble beaucoup à ce n'est pas possible du tout.

+0

ouais, c'est exactement le problème :-) – neoneye

2

Un lien est un nom supplémentaire associé à l'i-noeud. Il n'y a donc aucune possibilité de recibler un lien puisque le lien n'est pas un objet unique ciblant un fichier. C'est plus un nom secondaire d'un fichier.

C'est pourquoi vous devez d'abord dissocier (supprimer le nom associé au fichier), puis créer un nouveau lien (ajouter un nom) dans le nouveau fichier.

L'Inode du lien n'appartient pas au lien, il appartient au fichier. Un fichier se compose d'une liste de noms ("liens"), d'un identifiant (inode) et d'un ensemble de blocs de données contenant le contenu du fichier.

Un lien symbolique devrait être possible de renommer, car il se réfère uniquement au nom de texte d'un fichier. De manuel: Il y a neuf appels système qui ne suivent pas les liens, et qui opèrent sur le lien symbolique lui-même. Ils sont: lchflags (2), lchmod (2), lchown (2), lstat (2), lutimes (2), readlink (2), rename (2), rmdir (2) et unlink (2).

+2

La première partie est vraie pour les liens durs, mais elle est plus ou moins pertinente car l'OP pose des questions sur le lien symbolique. – BCS

2

En y regardant de plus près, In-Sl semble faire ce que vous voulez.

La première colonne est le numéro d'inode. Remarque il ne change pas:

$ 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 

Il ressemble à ln-sf utilise simplement unlink() et symlink() pour y parvenir:

$ 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

J'ai l'impression d'avoir manqué quelque chose parce que @neoneye a l'air de l'avoir déjà essayé, et cela semble complètement contredire ce que @UnixShadow a dit. – bukzor

+1

Je vois que vous obtenez le même inode. C'est vraiment intéressant. Cependant je reçois des inodes différents quand j'essaie la même chose. Je suppose que vous n'êtes pas sur Mac. Quelle plate-forme êtes-vous? – neoneye

+0

Cela fonctionne-t-il si vous faites d'autres opérations entre les deux? – BCS

Questions connexes