Symlink zu bereits bestehendem Verzeichnis

Symlink zu bereits bestehendem Verzeichnis

Gibt es eine geeignete Möglichkeit zum Verlinken /home/user/app/public, /home/user/public_htmlwenn 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_htmldas Endergebnis vermeiden kann.

Antwort1

Lassen Sie mich Ihr Problem richtig verstehen

Ihre Quelle ist /home/user/public_htmlund 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/publicund die Dateien anzeigen, die in vorhanden sind /home/user/public_html.

Wenn dies richtig ist, ist Ihre Quelle /home/user/public_htmlund 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/publices 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 lnso einfach nicht funktioniert.

Eine alternative Lösung wäre, mountanstelle 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 mounterfordert es Privilegien, also müssen Sie sudoes tun. Aus diesem Grund können Sie es nicht einfügen, .profileda 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 $sourceund Ihr Ziel ist $target.

  1. Entfernen Sie das Ziel zuerst manuell. Dies sollte unter Linux und Mac konsistent funktionieren.

    rm "$target"
    ln -s "$source" "$target"
    
  2. Wenn Sie Linux verwenden, können Sie diese -TOption nutzen.

    ln -sT "$source" "$target"
    
  3. Wenn Sie macOS verwenden, können Sie die -FOption nutzen.

    ln -sF "$source" "$target"
    

verwandte Informationen