Erfordert ln -s, dass Sie sich in einem bestimmten Verzeichnis befinden?

4115
evanrmurphy

Ich möchte einen einfachen Symlink zu einer Datei erstellen.

Es funktioniert perfekt, wenn ich den Befehl innerhalb des Verzeichnisses ausführe, in dem der Symlink erstellt werden soll:

/path/to/link $ ln -s /path/to/file . 

Wenn ich mich jedoch in einem anderen Verzeichnis befinde, wird jedes Mal ein fehlerhafter Link erstellt:

/any/other/path $ ln -s /path/to/file /path/to/link 

Müssen ln -sSie sich in einem bestimmten Verzeichnis befinden oder fehlt mir etwas? Ausführen von Ubuntu 10.04.

Update: Sorry für die Verwirrung darüber, ob die Pfade relativ oder absolut waren. Sie waren relativ, und wie viele in ihren Antworten erwähnt haben, war dies die Ursache meines Problems. Vielen Dank!

3

5 Antworten auf die Frage

5
sverre

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 
3
clemens

Ich neige dazu, zu verwenden

ln -s $(pwd)/local_file /path/to/link 

wenn ich eine lokale Datei verlinken muss.

1
Matthew Flaschen

Das ist für mich immer nicht verbindlich. Ich gewöhne mich daran:

ln -s $(readlink -f /path/to/file) /path/to/link 

was funktionieren sollte, aber auf Kosten der Nicht-Relation in der tatsächlichen Verknüpfung auf der Festplatte.

Ausreichend neuere GNU-Coreutils haben ein -e-Flag für Coreutils, dass Fehler auftreten, wenn das Ziel nicht existiert. Ich verwende das anstelle von -f. Ich finde es auch verwirrend und neige dazu, auch das -T-Flag zu verwenden. Croad Langshan vor 12 Jahren 0
@CroadLangshan, danke. Ich war mir der Option "readlink" nicht bewusst. Matthew Flaschen vor 12 Jahren 0
0
NPE

No, there is no such requirement:

aix@aix:/tmp$ cd /tmp aix@aix:/tmp$ mkdir test_path aix@aix:/tmp$ echo test > test_path/file.txt aix@aix:/tmp$ ln -s /tmp/test_path/file.txt /tmp/test_path/link.txt aix@aix:/tmp$ cat /tmp/test_path/link.txt test 

Make sure you have't mistyped any of the paths, and that you're using absolute paths everywhere (as your example indicates).

Es ist ein schlechtes Beispiel, aber ich bin mir sicher, dass die Datei / path / to / relativ ist. Matthew Flaschen vor 12 Jahren 0
Ja, der wirkliche Weg war relativ. Entschuldigung für die Verwirrung. Ich habe gerade das OP aktualisiert, um das zu klären. evanrmurphy vor 12 Jahren 0
0
Croad Langshan

It's not really about which directory you're in, in itself. It's about what symlink you make: symlinks are just files that contain a path that points to a file. You can make symlinks that contain paths that start with the / character, or symlinks that don't start with that character. You can create symlinks that contain .. path components, and symlinks that don't. When programs resolve symlinks to find the target file, they interpret the path as being relative to the directory that contains the symlink. So you just need to make sure the symlink has the path that you want.

Here's one way that's similar to Matthew Flaschen's answer, but here making a relative symlink:

/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 

No doubt that could be done in pure Bourne / bash shell too, but it's easy to write (and read) this correctly in python.