Wie erstelle ich unter Linux einen relativen symbolischen Link?

61

Ich benötige einen Symlink, der sich relativ zu dem Verzeichnis auflöst, in dem er abgelegt ist. Mit welchem ​​Befehl wird so etwas erstellt?

Jeremiah Rose
quelle

Antworten:

77
  1. Wechseln Sie zu dem Verzeichnis, in dem sich der Link befinden soll
  2. Führen Sie den Befehl aus ln -s ../some/other/file linkname

Der von Ihnen angegebene Pfad wird mit der Datei gespeichert. Beim Zugriff auf die Datei wird der gespeicherte Pfad nachgeschlagen und relativ zur Datei erweitert. Es weiß nicht, in welchem ​​Verzeichnis Sie sich befanden, als Sie den Link erstellt haben.

Jeremiah Rose
quelle
23
Nein, tust du nicht. Sie müssen nur sicherstellen, dass Sie den Speicherort relativ zum Linknamen anstelle Ihres aktuellen Verzeichnisses angeben.
Ignacio Vazquez-Abrams
5
Zum besseren Verständnis: Der von Ihnen angegebene Pfad wird mit der Datei gespeichert. Beim Zugriff auf die Datei wird der gespeicherte Pfad nachgeschlagen und relativ zur Datei erweitert. Es weiß nicht, in welchem ​​Verzeichnis Sie sich befanden, als Sie den Link erstellt haben.
Marian
2
genau das gleiche:ln -s ../some/other/file /some/dir/linkname
sehe
1
Anstatt ein Verzeichnis runter und wieder hoch zu gehen, können Sie dies auch einfach tun, ln -s ./file linknameda .auf das aktuelle Verzeichnis verwiesen wird.
Duersteler
1
ln -s somedir/original-dir link-namefunktioniert nicht. Es wird ein Verzeichnis mit Namen erstellt link-name, das einen ungültigen Link enthält. Der Befehl, der funktioniert, istln -sr somedir/original-dir link-name
Lorenz Meyer
28

Neuere Versionen von GNU coreutils 'ln (> = 8.16) unterstützen die Option --relative(oder -r), dh Sie können ln -s2 absolute oder relative (in Bezug auf Ihr Arbeitsverzeichnis) Pfade aufrufen, und es wird der korrekte relative Pfad ermittelt, der sein muss geschrieben an den symlink.

Bluewind
quelle
2
Vielen Dank. Die -rOption ist hilfreich , wenn Sie sind Quer Compilieren und brauchen absolute Pfade auf der Build - Host , aber relative Pfade auf dem Ziel.
Robert Calhoun
rdfind kann einige wirklich schlechte Symlinks erzeugen, die nicht nur absolut sind, sondern ohne Grund Verzeichnisse zurückverfolgen. ln -r -s targetfile myaliaskann Ihnen helfen, es zu beheben
Ray Foss
2

Grundsätzlich müssen Sie verstehen, dass ein Symlink eher einer Textdatei gleicht als einem Verzeichniseintrag, der eine Datei enthält. Also wenn du

echo ../poo >/file/name

dann ist das ganz ähnlich

ln -s ../poo /file/name

Dem System ist es egal, ob /file/../pooüberhaupt vorhanden, es ist nur ein Text, der in den Symlink eingefügt wird. Wenn etwas versucht, den Symlink zu öffnen , versucht das System, ihn aufzulösen.

Wenn Sie eine Shell mit Dateinamensvervollständigung verwenden, kann diese Funktion Probleme verursachen, da Sie einen Dateinamen relativ zu Ihrem aktuellen Arbeitsverzeichnis vervollständigen können, auch wenn Sie diesen dann als Ziel eines Symlinks in einem vollständig anderen Verzeichnis verwenden.

Tripleee
quelle
Dies wird von einigen Systemaufrufen missbraucht - ich weiß, dass z. B. BSD verwendet wurde, um Ihnen das Verknüpfen einer bestimmten Systemdatei zu ermöglichen, um <zu ändern, wie das System Speicher zuweist. Natürlich gibt es <in diesem Verzeichnis keine benannten Dateien. Es ist nur eine kostengünstige Möglichkeit, eine sehr kleine Datei zu erstellen, die gegenüber einer normalen Textdatei auf dieser bestimmten Plattform einige attraktive Eigenschaften aufweist.
Tripleee
Dieser Link ist jetzt tot. Versuchen Sie es mit man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5, aber beachten Sie auch, dass das Verhalten in neueren Versionen von OpenBSD viel weniger ... farbenfroh ist.
Tripleee
0

Relative Links waren für mich unter OS X schwierig, z

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

beide funktionierten nicht (etwas wurde erstellt, aber es war kein Verzeichnis). Ich habe den gewünschten Link mit absoluten Pfaden erstellt .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin
Cody Hess
quelle
Es ist eine praktikable Lösung, es muss also kein Kommentar sein. Dies kann als separate Antwort bleiben.
Slhck
1
Dein erster Versuch mit relativen Links ist einfach falsch und deshalb funktioniert es nicht. Sie haben falsch verstanden, wie relative Links funktionieren. Das ist nicht besonders schwierig (auch nicht, wenn Sie OS X verwenden). Vielleicht haben Sie sich bei den anderen Antworten über das Ändern Ihres Arbeitsverzeichnisses beim Erstellen des Links irregeführt. Das war nur, um es einfacher zu machen, den Link richtig zu machen und ist in keiner Weise notwendig. Sie definieren den relativen Pfad nicht relativ zu Ihrem aktuellen Verzeichnis, sondern zum Verzeichnis des Links. Dies ist, was Sie waren nach:ln -s Dropbox/git/codyhess/bin ~/bin
Timo
Auch @slhck, wenn jemand speziell fragt, wie relative Links in welcher Welt erstellt werden sollen, stellt ein Sprichwort, dass Sie absolute Links erstellen können, eine "tragfähige Lösung" dar? Es beantwortet speziell nicht die Frage des OP und ist daher das Gegenteil von Lösung, es ist keine Lösung. Dies sollte weder ein Kommentar noch eine Antwort sein, sondern eine Frage "Wie genau funktionieren relative Links (erklärt, damit Mac-Benutzer sie verstehen)?". Ich hoffe, dieser Mac-Benutzer hat es jetzt gut genug erklärt. :)
Timo
@TimoLehto Vielleicht möchten Sie den Kommentar an den ursprünglichen Autor (Cody Hess) richten. Ich habe nur den Beitrag abgeschrieben.
Slhck
@slhck, ich habe es an Sie gerichtet, weil Sie die Lösung als "durchführbar" erachteten und Ihr Kommentar mich glauben ließ, dass Sie die Person sein würden, die überzeugt, wenn man die Antwort als "keine Antwort" markieren wollte (und die Antwort erhalten wollte) Markierung akzeptiert).
Timo
0

Ich wollte nur erklären, wie man einen Symlink mit relativen Pfaden erstellt (mit einem detaillierten Beispiel).

Wie Ignacio Vazquez-Abrams in den Kommentaren erwähnt hat, müssen Sie den Speicherort der Datei / des Ordners relativ zu dem Ort angeben, an dem der Symlink erstellt wird, nicht relativ zu Ihrem aktuellen Verzeichnis.

BEISPIEL

Sie befinden sich in /usr/share/nginx/html/_src/learn Sie erstellen einen Symlink codingin/usr/share/nginx/html

Relativen Symlink erstellen (Theorie):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Erstelle einen tatsächlichen relativen Symlink:

sudo ln -s ./_src/learn/coding ../../coding

Weitere Informationen (gleiches Beispiel)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
TryHarder
quelle