2010-07-28 8 views
5

Normalerweise wird zum Ändern eines Symlink-Ziels zuerst die Verknüpfung der Datei aufgehoben und anschließend der Symlink mit dem neuen Zielpfad neu erstellt. Es wird jedoch eine neue Inode-Nummer zugewiesen.So ändern Sie das Symlink-Ziel, während Sie den Inode beibehalten

Vielleicht gibt es eine private Mac API mit einer update_target_for_symlink() Funktion, so dass der Inode kann gleich bleiben?

Falls Sie sich fragen, was ich brauche .. für einen Dateimanager. Ich bezweifle, dass dies überhaupt möglich ist. Wie auch immer, das macht es interessant.

Antwort

7

Es sieht so aus, als ob das überhaupt nicht möglich ist.

+0

ja, das ist genau das Problem :-) – neoneye

2

Ein Link ist ein zusätzlicher Name, der dem Inode zugeordnet ist. Es gibt also keine Möglichkeit, einen Link neu zu adressieren, da der Link kein eindeutiges Objekt ist, das auf eine Datei abzielt. Es ist mehr ein sekundärer Name einer Datei.

Deshalb müssen Sie zuerst die Verknüpfung aufheben (löschen Sie den mit der Datei verknüpften Namen) und erstellen Sie dann eine neue Verknüpfung (fügen Sie einen zusätzlichen Namen hinzu) zu der neuen Datei.

Der Inode des Links gehört nicht zum Link, er gehört zur Datei. Eine Datei besteht aus einer Liste von Namen ("Links"), einer Kennung (Inode) und einer Menge von Datenblöcken, die den Dateiinhalt enthalten.

Ein Symlink sollte umbenannt werden können, weil er sich nur auf den Text einer Datei bezieht.

Von manuell: Es gibt neun Systemaufrufe, die nicht auf Verbindungen folgen und die auf der symbolischen Verbindung selbst arbeiten. Sie sind: lchflags (2), lchmod (2), lchown (2), lstat (2), lutimes (2), readlink (2), umbenennen (2), rmdir (2) und unlink (2).

+2

Der erste Teil gilt für Hardlinks, ist aber mehr oder weniger irrelevant, da das OP nach Symlink fragt. – BCS

2

Wenn Sie genauer hinschauen, scheint ln -sf zu tun, was Sie wollen.

Die erste Spalte ist die Inode-Nummer. Hinweis: es ändert sich nicht:

$ 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 

Es ist wie ln-sf sieht verwendet einfach unlink() und symlink(), dies zu erreichen:

$ 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

Ich fühle mich, als würde ich etwas vermissen, weil @neoneye klingt, als ob er das bereits versucht hätte, und es scheint völlig zu widersprechen, was @UnixShadow gesagt hat. – bukzor

+1

Ich sehe, Sie bekommen die gleiche Inode. Das ist wirklich interessant. Allerdings bekomme ich verschiedene Inodes, wenn ich das gleiche versuche. Ich nehme an, du bist nicht auf Mac. Auf welcher Plattform bist du? – neoneye

+0

Funktioniert es, wenn Sie zwischendurch andere Ops machen? – BCS