Ln -s требует, чтобы вы были в определенном каталоге?

4038
evanrmurphy

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

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

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

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

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

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

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

3

5 ответов на вопрос

5
sverre

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

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

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

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

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

1
Matthew Flaschen

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

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

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

Достаточно недавно в GNU coreutils есть флаг -e для coreutils, который выдает ошибку, если цель не существует - я использую ее вместо -f. Я также нахожу это непонятным и склонен также использовать флаг -T. Croad Langshan 12 лет назад 0
@CroadLangshan, спасибо. Я не знал об этой опции `readlink`. Matthew Flaschen 12 лет назад 0
0
NPE

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

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 

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

Это плохой пример, но я уверен, что реальный / path / to / file относительно. Matthew Flaschen 12 лет назад 0
Да, реальный путь был относительным. Извините за путаницу. Я только что обновил ОП, чтобы прояснить это. evanrmurphy 12 лет назад 0
0
Croad Langshan

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

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

/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.

Похожие вопросы