Bietet ein Betriebssystem einen Mechanismus (Systemaufruf - kein Befehlszeilenprogramm) zum Ändern des Pfadnamens, auf den durch einen symbolischen Link (Symlink) verwiesen wird - außer durch Aufheben der Verknüpfung des alten und Erstellen eines neuen?
Der POSIX-Standard tut dies nicht. Solaris 10 nicht. MacOS X 10.5 (Leopard) nicht. (Ich bin mir ziemlich sicher, dass weder AIX noch HP-UX dies tun. Nach dieser Liste von Linux-Systemaufrufen zu urteilen , hat Linux auch keinen solchen Systemaufruf.)
Gibt es etwas, das tut?
(Ich erwarte, dass die Antwort "Nein" ist.)
Da es schwierig ist, ein Negativ zu beweisen, lassen Sie uns die Frage neu organisieren.
Wenn Sie wissen, dass ein (Unix-ähnliches) Betriebssystem, das noch nicht aufgeführt ist, keinen Systemaufruf zum Umschreiben des Werts eines Symlinks (der von zurückgegebenen Zeichenfolge readlink()
) hat, ohne den alten Symlink zu entfernen und einen neuen zu erstellen, fügen Sie ihn hinzu - oder sie - in einer Antwort.
ln
Befehl (oder die API gleichwertig) ausgeben, der den alten Link überschreibt? Welches Problem hast du?Antworten:
AFAIK, nein, das kannst du nicht. Sie müssen es entfernen und neu erstellen.Tatsächlich können Sie einen Symlink überschreiben und so den Pfadnamen aktualisieren, auf den er verweist:EDIT : Wie der OP in einem Kommentar darauf hingewiesen, die mit
--force
Option machtln
einen Systemaufruf durchzuführen ,unlink()
bevorsymlink()
. Untenstrace
beweist die Ausgabe auf meiner Linux-Box:Die endgültige Antwort lautet also "nein".BEARBEITEN : Das Folgende wurde aus der Antwort von Arto Bendiken auf unix.stackexchange.com, circa 2016, kopiert .
Dies kann in der Tat atomar erfolgen
rename(2)
, indem zuerst der neue Symlink unter einem temporären Namen erstellt und dann der alte Symlink auf einmal sauber überschrieben wird. Wie in der Manpage angegeben :In der Shell würden Sie dies
mv -T
wie folgt tun :Sie können
strace
diesen letzten Befehl ausführen, um sicherzustellen, dass er tatsächlichrename(2)
unter der Haube verwendet wird:Beachten Sie, dass oben beide
mv -T
undstrace
Linux-spezifisch sind.Verwenden Sie unter FreeBSD
mv -h
abwechselnd.Anmerkung des Herausgebers: So macht es Capistrano seit Jahren, seit ~ 2.15. Siehe diese Pull-Anfrage .
quelle
Ja, du kannst!
quelle
-f
Option bedeutet "Vorhandenes Ziel entfernen", bevor das neue erstellt wird. Dieser Befehl erzielt also das Ergebnis,unlink(2)
gefolgt vonsymlink(2)
. Darum ging es in der ursprünglichen Frage nicht. Beachten Sie auch, dass sowohl die akzeptierte Antwort als auch die am zweithäufigsten gewählte Antwortln -sf
für die Ausführung des Jobs verwendet werden. Wie diestrace
Ausgabe zeigt, ist dies jedoch der Fall,unlink()
undsymlink()
es gibt keinen Systemaufruf zum Ändern eines Symlinks.Es ist nicht erforderlich, die Verknüpfung des alten Symlinks explizit aufzuheben. Du kannst das:
(oder verwenden Sie den entsprechenden Symlink und benennen Sie Anrufe um). Dies ist besser als das explizite Aufheben der Verknüpfung, da das Umbenennen atomar ist. Sie können also sicher sein, dass der Link immer entweder auf das alte oder das neue Ziel verweist. Dadurch wird der ursprüngliche Inode jedoch nicht wiederverwendet.
Auf einigen Dateisystemen wird das Ziel des Symlinks im Inode selbst (anstelle der Sperrliste) gespeichert, wenn es kurz genug ist. Dies wird zum Zeitpunkt der Erstellung festgelegt.
In Bezug auf die Behauptung, dass der tatsächliche Eigentümer und die Gruppe unerheblich sind, gibt symlink (7) unter Linux an, dass es einen Fall gibt, in dem dies von Bedeutung ist:
quelle
set -x -e; mkdir junk; ( cd junk; mkdir olddir newdir; ln -s olddir mylink; ls -ilR; ln -s newdir temp; ls -ilR; mv temp mylink; ls -ilR; ); rm -fr junk
. Wenn Sie Dateien oldfile und newfile anstelle von Verzeichnissen erstellen und das entsprechende Skript ausführen (hauptsächlich olddir in oldfile ändern, newdir in newfile), erhalten Sie den erwarteten Effekt. Nur eine zusätzliche Komplexität! Danke für die Antwort.Nur eine Warnung zu den richtigen Antworten oben:
Die Verwendung der Methode -f / --force birgt das Risiko, dass die Datei verloren geht, wenn Sie Quelle und Ziel verwechseln:
Dies ist natürlich beabsichtigt, aber normalerweise treten Fehler auf. Das Löschen und Wiederherstellen des Symlinks ist also ein bisschen mehr Arbeit, aber auch ein bisschen sparsamer:
das hält zumindest meine Datei.
quelle
-f
oder--force
-Option ist immer etwas gefährlich. Es setzt voraus, dass der Benutzer weiß, worum es geht. Es ist doppelt tödlich, wenn Sie es gewöhnlich verwenden (rm -fr …
jedes Mal ist gefährlich).Würde es am Ende sowieso nicht dasselbe tun, wenn die Verknüpfung aufgehoben und das neue erstellt wird?
quelle
ln --force
Befehl wird einen vorhandenen Link absolut überschreiben.ln (1)
, während matt b. diskutiert die Tatsache, dasssymlink (2)
das Überschreiben nicht unterstützt wird. Sie haben beide Recht, und ich würde vorschlagen, dass ein Blick auf die Implementierung vonln (1)
die idomatischste Möglichkeit darstellt, das Unlink-Relink-Verfahren durchzuführen.Nur für den Fall, dass es hilft: Es gibt eine Möglichkeit, einen Symlink mit Midnight Commander (mc) zu bearbeiten. Der Menübefehl lautet (auf Französisch auf meiner mc-Oberfläche):
was übersetzt werden kann zu:
Die Verknüpfung lautet Cx Cs
Vielleicht verwendet es intern den
ln --force
Befehl, ich weiß es nicht.Jetzt versuche ich, eine Möglichkeit zu finden, viele Symlinks gleichzeitig zu bearbeiten (so bin ich hier angekommen).
quelle
unlink()
gefolgt von einem gibtsymlink()
, einfach weil dies Unix-ähnliche Systeme bieten.Technisch gesehen gibt es keinen integrierten Befehl zum Bearbeiten eines vorhandenen symbolischen Links. Dies kann leicht mit wenigen kurzen Befehlen erreicht werden.
Hier ist eine kleine Bash / Zsh-Funktion, die ich geschrieben habe, um einen vorhandenen symbolischen Link zu aktualisieren:
quelle
unlink()
undsymlink()
mit dem neuen Wert, der sich hinter den Kulissen mit Ihrem Code abspielt. Persönlich würde ich die Funktion auf genau zwei (oder vielleicht ein Vielfaches von zwei) Argumenten bestehen lassen und eine Kaution hinterlegen, wenn der Aufruf nicht korrekt wäre. Das ist jedoch eine besondere Perspektive.