Zu viele Ebenen symbolischer Links

100

Ich habe diese Dateistruktur erstellt:

test/src
test/firefox

Wenn ich diesen Befehl ausführe:

ln -s test/src test/firefox

Es wird erwartet, dass ein symbolischer Link test/firefox/srcerstellt wird, auf den test/srcverwiesen wird. Stattdessen wird der folgende Fehler angezeigt:

-bash: cd: src: Too many levels of symbolic links
  • Was mache ich falsch?
  • Können Sie keine symbolische Verknüpfung zu einem Ordner erstellen, der in einem gleichrangigen Ordner dieses Ordners gespeichert ist?
  • Was ist der Sinn davon?
David Zorychta
quelle
Ich bin nicht sicher, ob ich folge, was du getan hast. Bitte posten Sie die Ausgabe von ls -ld test test/*oder die genaue Folge von Befehlen, die Sie zum Erstellen dieser Dateien ausgeführt haben.
Gilles
mkdir test; mkdir test / src; mkdir test / firefox; ln-s Test / src Test / Firefox
David Zorychta
Mit diesen Befehlen cd test/firefox/srcwürde der Fehler angezeigt cd: no such file or directory: test/firefox/src, da test/firefox/srcein symbolischer Link baumelt. Laufen Sie cdauf einem anderen symbolischen Link namens src?
Gilles
Ich bin sicher, Sie haben etwas zwischen dem ln -sund dem getan, was cdSie uns nicht sagen. Unter der Annahme, dass sich testin Ihrem aktuellen Verzeichnis nur ein Unterverzeichnis befindet, sollte ein cd src(oder was auch immer Sie ausgeführt haben) einen Fehler auslösen. Hast du etwas hineingesteckt test/firefox?
Dubu
5
Und als @Gilles einen Hinweis gab, wird dieser Link nicht das tun, was Sie denken, dass es tut. Symbolische Links mit relativen Zielen sind immer relativ zu dem Symlink - Verzeichnis , nicht das Verzeichnis , aus dem Sie erstellt den Link. Wenn Sie sich also in einem Verzeichnis befinden /some/path, ln -s test/src test/firefoxwird ein Symlink erstellt, der von /some/path/test/firefox/srcnach /some/path/test/firefox/test/srcund nicht nach zeigt /some/path/test/src.
Dubu

Antworten:

32

An der Oberfläche funktioniert das, was Sie vorgeschlagen haben, für mich.

Beispiel

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

Stellen Sie den symbolischen Link her:

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

Wenn Sie es ein zweites Mal ausführen, wird in der Regel Folgendes erzeugt:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

Wahrscheinlich ist hier noch etwas los. Ich würde vermuten, dass Sie einen Zirkelverweis haben, bei dem ein Link zurück auf sich selbst zeigt.

Sie können finddies ein wenig ausspähen:

$ cd /suspected/directory
$ find -L ./ -mindepth 15
slm
quelle
2
find -L ./ -mindepth 15hat den Täter aufgedeckt
user7610 13.10.16
167

Wie Dubu in einem Kommentar betont, liegt das Problem in Ihren relativen Pfaden. Ich hatte ein ähnliches Problem beim Verknüpfen meiner Nginx-Konfiguration von /usr/local/etc/nginxnach /etc/nginx. Wenn du deinen Symlink so erstellst:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

Sie werden tatsächlich den Link / etc / nginx -> / etc / nginx erstellen, da der Quellpfad relativ zum Pfad des Links ist. Die Lösung ist so einfach wie die Verwendung absoluter Pfade:

ln -s /usr/local/etc/nginx /etc/nginx
Steen Schütt
quelle
57
Diese Antwort war klarer als die andere. "Verwenden Sie absolute Pfade."
Wulftone
1
Ich kann bestätigen, dass dies unter Windows funktioniert hat cygwin. Vielen Dank!
Dimiguel
Ich habe oft Probleme, die richtigen Argumente zu finden. Unter OSX und GNU Linux sind sie vertauscht, was mich noch mehr verwirrt.
Daniel W.
Ich kann immer noch nicht glauben, dass das funktioniert.
PNDA
5
Sie können relative Links verwenden , diese sollten jedoch auf dem Verzeichnis basieren, in dem sich der symbolische Link befindet . Mit anderen Worten: Das erste Argument sollte dasselbe sein, nach dem Sie schreiben würden,cd wenn Sie von dem Verzeichnis, in dem sich die Datei des symbolischen Links befindet, in das Zielverzeichnis wechseln möchten.
Totymedli
9

Symlinks beziehen sich auf das übergeordnete Verzeichnis des Links und nicht auf das aktuelle Verzeichnis des lnProzesses.

Wenn Sie das tun:

cd /top/dir
ln -s test/src test/firefox

(Wo test/firefoxist ein Verzeichnis), Sie machen einen test/firefox/srcSymlink, dessen Ziel ist test/src.

Das test/srcist relativ zum test/firefoxVerzeichnis, das ist also ein Symlink zu /top/dir/test/firefox/test/src.

Wenn Sie möchten, dass dieser Symlink ein Link zu ist /top/dir/test/src, müssen Sie Folgendes schreiben:

ln -s ../src test/firefox/

Oder

ln -s /top/dir/test/src test/firefox/

Im Allgemeinen ist es jedoch eine schlechte Idee, Symlinks zu absoluten Pfaden zu erstellen, da diese leicht beschädigt werden, wenn Verzeichnisse umbenannt oder Dateisysteme an anderer Stelle angehängt werden.

Mit GNU lnkönnen Sie seine -rOption verwenden, um die Berechnung selbst durchführen zu lassen:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src
Stéphane Chazelas
quelle
5

Verwenden Sie den absoluten Pfad anstelle des relativen Pfads, dann funktioniert es.

Z.B:

ln -s /home/user/test/src /home/user/test/firefox
JISHNU TU
quelle
0

Die Antwort ist, den absoluten Pfad zu verwenden. Es kann jedoch ärgerlich sein, den vollständigen Pfad für etwas einzugeben, das sich im aktuellen Verzeichnis befindet. Sie können die Befehlsersetzung von pwd verwenden, um dies zu vermeiden. Wenn sich Ihr Ziel im aktuellen Verzeichnis befindet:

ln -s "$(pwd)"/target abs/path/to/link 

Wenn sich Ihr Link im aktuellen Verzeichnis befinden soll:

ln -s /abs/path/to/target "$(pwd)"
Brotbier
quelle