3

Я хочу создать простую символическую ссылку на файл.

Это прекрасно работает, если я запускаю команду из каталога, в котором я хочу создать символическую ссылку:

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

Но если я нахожусь в любом другом каталоге, он каждый раз создает неработающую ссылку:

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

ln -s требует, чтобы вы были в определенном каталоге, или я что-то упустил? Запуск Ubuntu 10.04.

Обновление: извините за путаницу относительно того, были ли пути относительными или абсолютными. Они были относительными, и, как некоторые из них упоминали в своих ответах, это было источником моей проблемы. Спасибо!

5 ответов5

5

Если вы не находитесь в том же каталоге, что и цель, вы должны убедиться, что используете абсолютный путь.

ln -s foo/bar baz/quux # fails

ln -s ~/foo/bar baz/quux # succeeds
3

Я склонен использовать

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

когда мне нужно связать локальный файл.

1

Это всегда не интуитивно для меня. У меня есть привычка делать:

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

который должен работать, но за счет того, чтобы сделать его не относительным в фактической связи на диске.

0

Нет, такого требования нет:

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

Убедитесь, что вы не опечатали ни один из путей, и что вы используете абсолютные пути везде (как показывает ваш пример).

0

Дело не в том, в каком каталоге вы находитесь. Речь идет о том, какую символическую ссылку вы создаете: символические ссылки - это просто файлы, которые содержат путь, указывающий на файл. Вы можете создавать символические ссылки, которые содержат пути, начинающиеся с символа / , или символические ссылки, которые не начинаются с этого символа. Вы можете создавать символические ссылки, которые содержат .. компоненты пути, и символические ссылки, которые этого не делают. Когда программы разрешают символические ссылки, чтобы найти целевой файл, они интерпретируют путь как относительный к каталогу, который содержит символическую ссылку. Так что вам просто нужно убедиться, что символическая ссылка имеет путь, который вы хотите.

Вот один способ, который похож на ответ Мэтью Флэшена, но здесь сделаем относительную символическую ссылку:

/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

Без сомнения, это можно сделать и в чистой оболочке Bourne / bash, но это легко написать (и прочитать) это правильно на python.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .