Symbolische Verlinkung im Terminal (Was mache ich falsch?)

814
jsejcksn

Ich möchte symbolische Links für alle Dateien in einem Ordner erstellen parent/target/. Ich möchte, dass sich die Links im Ordner befinden parent/destination/. Mein Arbeitsverzeichnis ist parent/für folgende Terminalausgabe mit bash:

$ cd target/
$ ll
total 16
drwxr-xr-x 4 jesse staff 136 Feb 23 16:31 ./
drwxr-xr-x@ 10 jesse staff 340 Feb 23 16:38 ../
-rw-r--r-- 1 jesse staff 10 Feb 23 16:23 file.txt
-rw-r--r-- 1 jesse staff 10 Feb 23 16:23 file2.txt
$ ln -s * ../destination/
$ ll ../destination/
total 16
drwxr-xr-x 4 jesse staff 136 Feb 23 16:38 ./
drwxr-xr-x@ 10 jesse staff 340 Feb 23 16:38 ../
lrwxr-xr-x 1 jesse staff 8 Feb 23 16:38 file.txt@ -> file.txt
lrwxr-xr-x 1 jesse staff 9 Feb 23 16:38 file2.txt@ -> file2.txt

Warum werden Symlinks erstellt, die auf sich selbst verweisen? Ich habe die lnManpage und verschiedene andere lnSE-Fragen gelesen, aber ich vermute, dass mir etwas fehlt.

(Ich verwende bash im Terminal in OS X 10.11.3)

0
Sie müssen einen absoluten Pfad in der Quelle angeben, z. B. ln -s / home / jesse / target / * ../ destination / `. AFH vor 8 Jahren 1
@AFH Danke. Das hat perfekt funktioniert. Warum benötigt 'ln' einen absoluten Pfad für das Ziel? Gibt es andere bash-Programme, die absolute Pfade benötigen? Das ist nichts, was mir vorher schon begegnet ist. Bitte fügen Sie das auch als Antwort hinzu, damit ich es als richtig markieren kann. jsejcksn vor 8 Jahren 0

1 Antwort auf die Frage

1
AFH

Sie müssen einen absoluten Pfad in der Quelle angeben. In Ihrem Fall wäre das:

ln -s $PWD/* ../destination/ 

Im Gegensatz zu einer festen Verknüpfung, bei der der erstellte Verzeichniseintrag direkt auf dieselbe Quelldatei verweist, enthält eine symbolische Verknüpfung den Text der ursprünglichen Dateiverweisung. Tatsächlich muss die Quelldatei nicht vorhanden sein, wenn eine symbolische Verknüpfung erstellt wird. Durch die Verwendung von wird jedoch *sichergestellt, dass nur vorhandene Quelldateien verwendet werden.

Tatsächlich ist es etwas komplizierter als das: Wenn Sie in der Verknüpfung einen absoluten Pfad angeben, verhält sich der Verweis auf die Verknüpfung so, als hätten Sie die Originaldatei angegeben. Wenn Sie jedoch einen relativen Pfad angeben, wird dieser dem Verzeichnis hinzugefügt, in dem sich der Link befindet. Eine Alternative, die Sie aus dem targetVerzeichnis verwenden könnten, ist:

cd ../destination/; ln -s ../target/* . 

Dies hätte den gleichen Effekt wie ein absoluter Pfad, unterscheidet sich jedoch darin: Wenn der gesamte Verzeichnisbaum an einen anderen Speicherort kopiert oder verschoben wurde (z. B. irgendwo in einem Verzeichnis eines anderen Benutzers), verweisen die Links auf die Dateien an ihrem neuen Speicherort. Die Wahl der absoluten oder relativen Links hängt daher davon ab, ob Sie die Quelldateien zusammen mit den Links kopieren oder verschieben möchten: Wenn die Quelldateien immer am selben Ort bleiben, verwenden Sie absolute Links.

Dies hat meine Frage definitiv beantwortet und mir ein paar Dinge beigebracht. Dank dafür. Ich habe eine Frage zum letzten Bit ... Ich habe getestet, was Sie vorgeschlagen haben, wenn Sie einen relativen Pfad verwenden, um zu sehen, ob die Links den verschobenen Dateien folgen, aber sie haben es nicht getan. Meine Struktur sieht folgendermaßen aus: /a/1.txt /a/2.txt / aa / / b / `und ich lief` cd b /; ls -s ../a/*. / `was die Links erzeugt hat, aber als ich die beiden Textdateien in den Ordner` aa` verschoben habe, funktionierten die Links nicht mehr. jsejcksn vor 8 Jahren 0
Ich glaube nicht, dass Sie verstanden haben, was ich zu relativen Links gesagt habe: Sie müssen sowohl die Originaldateien als auch die Links als Teil derselben Unterverzeichnisstruktur verschieben. Sie können sich nicht bewegen und nicht die andere. Wenn Ihre Dateien also `dir1 / a / *. Txt 'und die Links` dir1 / b / *. Txt' sind, können Sie die gesamte Struktur von 'dir1 / `nach` dir2 / `und die Links verschieben / kopieren funktioniert immer noch, während absolute Links immer noch auf 'dir1 / `verweisen. Wenn Sie die Dateien unabhängig von den Links verschieben, müssen Sie die Links neu erstellen - in Ihrem Fall nach `../ aa / *`. AFH vor 8 Jahren 0
Ok, das klärt es für mich. Danke für alle Infos. jsejcksn vor 8 Jahren 0