Если вы не находитесь в том же каталоге, что и цель, вы должны убедиться, что используете абсолютный путь.
ln -s foo/bar baz/quux # fails ln -s ~/foo/bar baz/quux # succeeds
Я хочу создать простую символическую ссылку на файл.
Это прекрасно работает, если я запускаю команду из каталога, в котором я хочу создать символическую ссылку:
/path/to/link $ ln -s /path/to/file .
Но если я нахожусь в любом другом каталоге, он каждый раз создает неработающую ссылку:
/any/other/path $ ln -s /path/to/file /path/to/link
Требуется ли ln -s
вам быть в определенном каталоге, или я что-то упустил? Запуск Ubuntu 10.04.
Обновление: извините за путаницу относительно того, были ли пути относительными или абсолютными. Они были относительными, и, как некоторые из них упоминали в своих ответах, это было источником моей проблемы. Спасибо!
Если вы не находитесь в том же каталоге, что и цель, вы должны убедиться, что используете абсолютный путь.
ln -s foo/bar baz/quux # fails ln -s ~/foo/bar baz/quux # succeeds
Я склонен использовать
ln -s $(pwd)/local_file /path/to/link
когда мне нужно связать локальный файл.
Это всегда не интуитивно для меня. У меня есть привычка делать:
ln -s $(readlink -f /path/to/file) /path/to/link
который должен работать, но за счет того, чтобы сделать его не относительным в фактической связи на диске.
Нет, такого требования нет:
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
Убедитесь, что вы не опечатали ни один из путей, и что вы используете абсолютные пути везде (как показывает ваш пример).
Дело не в том, в каком каталоге вы находитесь. Речь идет о том, какую символическую ссылку вы создаете: символические ссылки - это просто файлы, которые содержат путь, указывающий на файл. Вы можете создавать символические ссылки, которые содержат пути, начинающиеся с /
символа, или символические ссылки, которые не начинаются с этого символа. Вы можете создавать символические ссылки, которые содержат ..
компоненты пути, и символические ссылки, которые не содержат . Когда программы разрешают символические ссылки, чтобы найти целевой файл, они интерпретируют путь как относительный к каталогу, который содержит символическую ссылку. Так что вам просто нужно убедиться, что символическая ссылка имеет путь, который вы хотите.
Вот один способ, который похож на ответ Мэтью Флэшена, но здесь сделаем относительную символическую ссылку:
/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.