2010-07-28 15 views
5

Normalmente per modificare un target di collegamento simbolico, prima verrà scollegato il file e quindi ricreato il collegamento simbolico con il nuovo percorso di destinazione. Tuttavia verrà assegnato un nuovo numero di inode.come modificare la destinazione del collegamento simbolico conservando l'inode

Forse c'è un api Mac privato con una funzione update_target_for_symlink(), quindi l'inode può rimanere lo stesso?

Nel caso ti chiedi cosa mi serve per .. un file manager. Dubito che questo sia possibile a tutti. Comunque questo è ciò che lo rende interessante.

risposta

7

Sembra che questo non sia affatto possibile.

+0

sì, questo è esattamente il problema :-) – neoneye

2

Un collegamento è un nome aggiuntivo associato all'inode. Quindi non esiste la possibilità di retargetare un collegamento poiché il collegamento non è un oggetto univoco che ha come target un file. È più un nome secondario di un file.

Ecco perché è necessario prima scollegarlo (eliminare il nome associato al file) e quindi creare un nuovo collegamento (aggiungere un nome aggiuntivo) al nuovo file.

L'inode del collegamento non appartiene al collegamento, appartiene al file. Un file è costituito da un elenco di nomi ("link"), un identificatore (inode) e un gruppo di blocchi di dati contenenti il ​​contenuto del file.

Un collegamento simbolico dovrebbe essere possibile rinominare, perché si riferisce solo al nome di testo di un file.

Dal manuale: Esistono nove chiamate di sistema che non seguono i collegamenti e che operano sul collegamento simbolico stesso. Sono: lchflags (2), lchmod (2), lchown (2), lstat (2), lutimes (2), readlink (2), rename (2), rmdir (2) e unlink (2).

+2

La prima parte è vera per gli hardlink, ma è più o meno irrilevante in quanto l'OP sta chiedendo di symlink. – BCS

2

Guardando più da vicino, ln -sf sembra fare quello che vuoi.

La prima colonna è il numero di inode. Nota non cambia:

$ 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 

Sembra ln-sf usa semplicemente scollegare() e link simbolico() per raggiungere questo obiettivo:

$ 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

Mi sento come se mi mancasse qualcosa perché @neoneye sembra che abbia già provato questo, e sembra contraddire completamente ciò che @UnixShadow ha detto. – bukzor

+1

Vedo che ottieni lo stesso inode. Questo è davvero interessante. Tuttavia ottengo diversi inode quando provo lo stesso. Immagino che tu non sia su Mac. Quale piattaforma utilizzi? – neoneye

+0

Funziona se fai altre operazioni in mezzo? – BCS

Problemi correlati