Erstellen Sie eine symbolische Verknüpfung zum aktuellen Verzeichnis


110

Ich versuche einen symbolischen Link in meinem Home-Verzeichnis zu erstellen, der auf ein Verzeichnis auf meiner externen Festplatte verweist.

Es funktioniert gut, wenn ich es so spezifiziere:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

Es wird jedoch ein fehlerhafter Link erstellt, wenn ich dies versuche:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

Dies schafft eine Verbindung, in die ich nicht cdhinein kann.

Wenn ich es versuche, beschwert sich bash:

bash: cd: Data: Too many levels of symbolic links

Die symbolische Datenverknüpfung in meinem Zuhause ist ebenfalls rot eingefärbt, wenn lsdie farbige Ausgabe aktiviert ist.

Warum passiert dies? Wie kann ich auf diese Weise einen Link erstellen? (Ich möchte einen Symlink zu einem Verzeichnis in meinem Arbeitsverzeichnis in einem anderen Verzeichnis erstellen.)


Bearbeiten: Laut dieser StackOverflow-Antwort wird, wenn das zweite Argument (in meinem Fall ~ / Data) bereits existiert und ein Verzeichnis ist ln, ein Symlink zu dem Ziel in diesem Verzeichnis erstellt.

Ich habe jedoch das gleiche Problem mit:

ln -s Data/ ~/

7
Nur ein zufälliger Tipp: cd ~Ist normalerweise der gleiche wie cd.

3
ls -l ~/Datahätte dir geholfen zu sehen, was mit dem "roten" Link nicht stimmt.
msw

Hm, wusste nicht, dass ich das machen kann, danke. Ich erinnere mich, cates versucht zu haben, aber ich habe vergessen, was das Ergebnis war ... (Ich bin im Moment nicht zu Hause.)
jcora

Randnotiz : Angenommen , Sie möchten nur einen Symlink aller Dateien, Richt und subdir in einem bestimmten Ordner erstellen, sagen wir, alle Elemente im Inneren verwenden Sie dann den folgenden/run/media/name/exhdd/Data/Dataln -s /run/media/name/exhdd/Data/* Data
user2555595

Antworten:


115

Hier ist was passiert. Wenn Sie einen Symlink mit einem relativen Pfad erstellen, ist der Symlink relativ. Symlinks speichern nur die Pfade, die Sie ihnen geben. Sie lösen niemals Pfade zu vollständigen Pfaden auf. Laufen

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

erstellt einen Symlink namens ls2in /usr/binzu ls(nämlich. /usr/bin/ls) in Bezug auf das Verzeichnis, das das Symlink in ist ( /usr/bin). Der obige Befehl würde einen funktionalen Symlink aus einem beliebigen Verzeichnis erstellen.

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

Wenn Sie den Symlink in ein anderes Verzeichnis verschieben, verweist er nicht mehr auf die Datei unter /usr/bin/ls.

Sie erstellen einen Symlink, der auf verweist Data, und benennen ihn Data. Es zeigt auf sich. Sie müssen einen Symlink mit dem absoluten Pfad des Verzeichnisses erstellen.

ln -s "$(realpath Data)" ~/Data

14

Ich hatte das gleiche Problem. Google hat zu dieser Antwort geführt, aber die einfachste Lösung ist hier nicht dokumentiert:

ln -sT 

-T macht den Trick

Mann ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

Füge dies einfach hier hinzu, damit jeder mit der gleichen Frage dies finden kann :)


9

lnDas Verhalten mit relativen Pfaden ist nicht intuitiv. Verwenden Sie die -rFlagge , um die geistige Gesundheit wiederherzustellen .

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

Erläuterung:

   -r, --relative
          create symbolic links relative to link location

Es bedeutet, dass lndas getan wird, was Sie erwarten. Es wird berücksichtigt , in welchem Verzeichnis Sie sich befinden, in welchem Verzeichnis das Ziel in ist, und einen Pfad relativ zum Verzeichnis konstruieren wird der Link in sein. Das Standardverhalten (ohne -r) ist der erste Parameter (Ziel) zu interpretieren wahrsten Sinne des Wortes , in In diesem Fall müssen Sie den Pfad selbst so erstellen, dass er im Verzeichnis des Links gültig ist.

Verwenden Sie alternativ einen absoluten Pfad, wie von @SmithJohn erwähnt

ln -s "$(realpath Data)" ~/Data #bash shell

oder

ln -s "(realpath Data)" ~/Data #fish shell

-1

Ganz einfach können Sie einen Link für einen Ordner erstellen. Schau mein Kommando

ln -s / home / Zielordner / var / www / html / link_name

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.