Symlink erstellen - überschreiben, falls vorhanden

54

Ich möchte Daten speichern /path/to/data/folder/month/date/hour/minute/fileund mit diesen verknüpfen /path/to/recent/fileund dies bei jeder Erstellung einer Datei automatisch tun.

Angenommen, ich weiß nicht im Voraus, ob es /path/to/recent/fileexistiert. Wie kann ich vorgehen, um es zu erstellen (wenn es nicht existiert) oder zu ersetzen (wenn es existiert)? Ich bin sicher, ich kann einfach prüfen, ob es existiert, und dann einen Lösch- oder Symlink-Befehl ausführen, aber ich frage mich, ob es einen einfachen Befehl gibt, der in einem Schritt das macht, was ich will.

drjrm3
quelle
Wenn das Ziel existiert, aber kein Symlink ist, was möchten / erwarten Sie dann?
Toby Speight

Antworten:

34

Bitte lesen Sie das Handbuch .

ln -sfn /new/target /path/to/symlink

$ man ln

-n, --no-dereference
behandelt LINK_NAME als normale Datei, wenn es sich um eine symbolische Verknüpfung zu einem Verzeichnis handelt

LithiumSix
quelle
1
Warum ist das die richtige Antwort?
Mrchief
1
@Mrchief Wenn /path/to/symlinkbereits ein Symlink zu einem Verzeichnis ohne -nFlag vorhanden ist, wird der Symlink in erstellt, /path/to/symlink/targetanstatt zu ersetzen/path/to/symlink
Flimm
Beachten Sie, dass dies unter macOS in einigen Fällen immer noch nicht funktioniert, zum Beispiel, wenn /path/to/symlinkes ein Verzeichnis und keinen Symlink gibt. Ich denke, die einzige Möglichkeit, dies zu umgehen, besteht darin, rm -rfzuerst zu laufen .
Flimm
78

Dies ist der Zweck der ln‚s -fOption: die bestehenden Zieldateien entfernt, falls vorhanden, bevor die Verbindung zu schaffen.

ln -sf /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file

erstellt den Symlink /path/to/recent/file, auf den verwiesen wird , /path/to/data/folder/month/date/hour/minute/fileund ersetzt gegebenenfalls eine vorhandene Datei oder einen Symlink zu einer Datei (und funktioniert einwandfrei, wenn dort bereits nichts vorhanden ist).

Wenn bereits ein Verzeichnis oder ein Symlink zu einem Verzeichnis mit dem Zielnamen vorhanden ist, wird der Symlink darin erstellt (so dass Sie /path/to/recent/file/fileim obigen Beispiel enden würden ). Die -nOption, die in einigen Versionen von verfügbar lnist, kümmert sich um Symlinks zu Verzeichnissen und ersetzt diese bei Bedarf:

ln -sfn /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file

Da POSIXln keine Angaben macht -n, können Sie sich nicht generell darauf verlassen. Ein Großteil des lnVerhaltens ist implementierungsspezifisch, sodass Sie die Besonderheiten des von Ihnen verwendeten Systems überprüfen müssen. Wenn Sie mit GNUln , können Sie die Verwendung -tund -Tauch Optionen, um sein Verhalten völlig vorhersehbar in Gegenwart von Verzeichnissen zu machen ( dh nicht statt den Link innerhalb des bestehenden Verzeichnisses mit dem gleichen Namen erstellen).

Stephen Kitt
quelle