Ich möchte einen einfachen symbolischen Link zu einer Datei erstellen.
Es funktioniert einwandfrei, wenn ich den Befehl aus dem Verzeichnis ausführe, in dem der symbolische Link erstellt werden soll:
/path/to/link $ ln -s /path/to/file .
Wenn ich mich jedoch in einem anderen Verzeichnis befinde, wird jedes Mal ein defekter Link erstellt:
/any/other/path $ ln -s /path/to/file /path/to/link
Ist es ln -s
erforderlich, dass Sie sich in einem bestimmten Verzeichnis befinden, oder übersehe ich etwas? Es wird Ubuntu 10.04 ausgeführt.
Aktualisieren:Entschuldigen Sie die Verwirrung darüber, ob die Pfade relativ oder absolut waren. Sie waren relativ, und wie mehrere in ihren Antworten erwähnten, war dies die Ursache meines Problems. Danke!
Antwort1
Wenn Sie sich nicht im selben Verzeichnis wie das Ziel befinden, müssen Sie sicherstellen, dass Sie den absoluten Pfad verwenden.
ln -s foo/bar baz/quux # fails
ln -s ~/foo/bar baz/quux # succeeds
Antwort2
Ich neige dazu,
ln -s $(pwd)/local_file /path/to/link
wenn ich eine lokale Datei verknüpfen muss.
Antwort3
Das ist für mich immer unintuitiv. Ich gewöhne mir an, Folgendes zu tun:
ln -s $(readlink -f /path/to/file) /path/to/link
Das sollte funktionieren, allerdings auf Kosten der Nichtrelativität im tatsächlichen On-Disk-Link.
Antwort4
Es geht nicht wirklich darum, in welchem Verzeichnis Sie sich befinden. Es geht darum, welchen symbolischen Link Sie erstellen: symbolische Links sind einfach Dateien, die einen Pfad enthalten, der auf eine Datei verweist. Sie können symbolische Links erstellen, die Pfade enthalten, die mit dem /
Zeichen beginnen, oder symbolische Links, die nicht mit diesem Zeichen beginnen. Sie können symbolische Links erstellen, die ..
Pfadkomponenten enthalten, und symbolische Links, die dies nicht tun. Wenn Programme symbolische Links auflösen, um die Zieldatei zu finden, interpretieren sie den Pfad als relativ zum Verzeichnis, das den symbolischen Link enthält. Sie müssen also nur sicherstellen, dass der symbolische Link den gewünschten Pfad enthält.
Hier ist eine Möglichkeit, die der Antwort von Matthew Flaschen ähnelt, aber hier einerelativsymbolischer Link:
/tmp$ mkdir -p spam/eggs/ham
/tmp$ mkdir foo
/tmp$ python -c "import os, sys; print os.path.relpath(sys.argv[1], os.path.abspath(sys.argv[2])), sys.argv[2]" $(readlink -e foo) spam/eggs/ham | xargs ln -s
/tmp$ ls -l spam/eggs/ham/foo
lrwxrwxrwx 1 user user 12 2012-02-05 15:12 spam/eggs/ham/foo -> ../../../foo
Zweifellos könnte dies auch in einer reinen Bourne-/Bash-Shell durchgeführt werden, aber es ist einfacher, dies in Python korrekt zu schreiben (und zu lesen).