
Gibt es eine geeignete Möglichkeit zum Verlinken /home/user/app/public
, /home/user/public_html
wenn man bedenkt, dass das Ziel bereits existiert?
Wenn ich das tue ln -s /home/user/app/public /home/user/public_html
, habe ich am Ende /home/user/public_html/public
…
Ich schätze, es wäre auch möglich, die Aktion umzukehren, beispielsweise ln -s /home/user/public_html /home/user/app/public
, ich bin mir jedoch nicht sicher, wie ich /home/user/app/public/public_html
das Endergebnis vermeiden kann.
Antwort1
Lassen Sie mich Ihr Problem richtig verstehen
Ihre Quelle ist /home/user/public_html
und ich nehme an, dass sie Dateien enthält. Und Sie möchten direkt in einen Link zu diesem Verzeichnis erstellen /home/user/app/public
. Auf diese Weise könnten Sie dann etwas wie tun ls /home/user/app/public
und die Dateien anzeigen, die in vorhanden sind /home/user/public_html
.
Wenn dies richtig ist, ist Ihre Quelle /home/user/public_html
und das Ziel /home/user/app/public
. Der richtige Befehl ist dieser:
ln -s /home/user/public_html /home/user/app/public
Stellen Sie vor der Eingabe des Befehls einfach sicher, dass /home/user/app/public
es sich nicht um ein gültiges Verzeichnis oder eine gültige Datei handelt.
Antwort2
Wenn ich Ihre Frage richtig verstehe, wollten Sie wissen, wie mit bereits vorhandenen Zielen umgegangen werden soll. Wenn dies der Fall ist, gibt es zwei mögliche Szenarien.
1) das vorhandene Ziel ist eine Datei. In diesem Fall können Sie die Erstellung des Symlinks mit "-f" erzwingen.
2) das vorhandene Ziel ist ein Verzeichnis. Wenn dies der Fall ist, hängt es von Ihrer aktuellen Implementierung des ln-Befehls ab. Eskönntedas Argument „-n“ verfügbar haben, das dafür sorgt, dass symbolische Links zu Verzeichnissen richtig behandelt werden, statt sie zu duplizieren, wie Sie sagen.
Referenz:https://unix.stackexchange.com/questions/207294/create-symlink-overwrite-if-one-exists
Antwort3
Ich werde hier nicht näher darauf eingehen, da die richtige Antwort bereits ausgewählt wurde, aber ln
so einfach nicht funktioniert.
Eine alternative Lösung wäre, mount
anstelle von zu verwenden ln
. Ich glaube, in diesem Fall wäre der richtige Befehl:
sudo mount --bind ~/app/public ~/public_html
Beachten Sie jedoch den Vorbehalt, wenn Sie es auf diese Weise tun: meiner Erfahrung nach mount
erfordert es Privilegien, also müssen Sie sudo
es tun. Aus diesem Grund können Sie es nicht einfügen, .profile
da dies Ihre Sitzung sperren würde. Sie könnten es in ein Skript einfügen oder es zu hinzufügen /etc/fstab
. Ich füge gebundene Mounts im Allgemeinen nicht zu hinzu fstab
, aber ich glaube, der Eintrag wäre:
/home/user/app/public /home/user/public_html none defaults,bind 0 0
oder etwas sehr Ähnliches. Ich bin mir auch ziemlich sicher, dass Sie in keine relativen Pfade verwenden können fstab
, also müssen die Pfade absolut sein, wie ich hier gezeigt habe.
Antwort4
Wie @jotadepicas und @Milkmannetje in den Kommentaren andeuten, gibt es mehrere Möglichkeiten, damit umzugehen.
Angenommen, Ihre Quelle ist $source
und Ihr Ziel ist $target
.
Entfernen Sie das Ziel zuerst manuell. Dies sollte unter Linux und Mac konsistent funktionieren.
rm "$target" ln -s "$source" "$target"
Wenn Sie Linux verwenden, können Sie diese
-T
Option nutzen.ln -sT "$source" "$target"
Wenn Sie macOS verwenden, können Sie die
-F
Option nutzen.ln -sF "$source" "$target"