Требует ли ln -s, чтобы вы были в определенном каталоге?
Я хочу создать простую символическую ссылку на файл.
Это прекрасно работает, если я запускаю команду из каталога, в котором я хочу создать символическую ссылку:
/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 ответов
Если вы не находитесь в том же каталоге, что и цель, вы должны убедиться, что используете абсолютный путь.
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
который должен работать, но за счет того, чтобы сделать его не относительным в фактической связи на диске.
Дело не в том, в каком каталоге вы находитесь. Речь идет о том, какую символическую ссылку вы создаете: символические ссылки - это просто файлы, которые содержат путь, указывающий на файл. Вы можете создавать символические ссылки, содержащие пути, начинающиеся с /
символ или символические ссылки, которые не начинаются с этого символа. Вы можете создавать символические ссылки, которые содержат ..
компоненты пути и символические ссылки, которые этого не делают. Когда программы разрешают символические ссылки, чтобы найти целевой файл, они интерпретируют путь как относительный к каталогу, который содержит символическую ссылку. Так что вам просто нужно убедиться, что символическая ссылка имеет путь, который вы хотите.
Вот один способ, который похож на ответ Мэтью Флэшена, но здесь сделаем относительную символическую ссылку:
/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.
Нет, такого требования нет:
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
Убедитесь, что вы не опечатали ни один из путей, и что вы используете абсолютные пути везде (как показывает ваш пример).