1

У меня дома есть две директории: ~/dir1 и ~/dir2 с файлом в первой: ~/dir1/file.txt Можно ли как-нибудь сделать ссылку на него из ~/dir2 не переходя в ~/ и если нет, то почему это так?

Я пытался из ~/ работает:

$ ln -s ./dir1/file.txt ./dir2/file.txt

но, как и следовало ожидать, это приводит к тому, что результирующая символическая ссылка эффективно указывает на ~/dir1/dir2/file.txt что имеет смысл, но не то, что я на самом деле хочу.

Я также попробовал:

$ ln -s ./dir1/file.txt ../dir2/file.txt

Который возвращает:

ln: failed to create symbolic link `../dir2/file.txt': No such file or directory

Я ожидал бы, что это просто создаст символическую ссылку ~/dir2/file.txt указывающую на ~/../dir1/file.txt

Итак, я предполагаю, что мой настоящий вопрос заключается в следующем: могу ли я заставить ln создать символическую ссылку на файл, который, по его мнению, не существует?

Изменить: Для большей ясности относительно того, что я пытаюсь достичь, я хочу одну команду, которую я могу запустить из моего домашнего каталога, которая будет эффективно выполнять:

pushd dir2/ && ln -s ../dir1/file.txt && popd

или в Python (это самое близкое к тому, что я хочу):

echo "import os; os.symlink('../dir1/file.txt', './dir2/file.txt')" | python

2 ответа2

2

Ваш вопрос немного запутанный.

  1. Вы спросили: «Могу ли я сделать символическую ссылку на него из ~/dir1 [...]?" Я полагаю, вы имели в виду" из ~/dir2 ", основываясь на остальной части вашего поста?

  2. Ваша первая команда

    $ ln -s ./dir1/file.txt ./dir2/file.txt

    не делает то, что вы думаете, что делает. Предполагая, что вы все еще находитесь в своем домашнем каталоге, приведенная выше команда создает символическую ссылку, собственный путь которой ~/dir2/file.txt , и эта символическая ссылка буквально указывает на путь ./dir1/file.txt . Поскольку указанная символическая ссылка находится в каталоге ~/dir2 , такой целевой путь разрешается в ~/dir2/./dir1/file.txt , который в дальнейшем разрешается в ~/dir2/dir1/file.txt (вероятно, не существует, а не то, что вы хочу). Поэтому я сомневаюсь, почему вы сказали, что он разрешается в ~/dir1/dir2/file.txt .

  3. Ваша вторая команда не выполняется, потому что нет директории ../dir2 для вставки символической ссылки, и именно это означало сообщение об ошибке.

  4. Чтобы ответить на ваш вопрос, да. ОС не заботится о том, указывает ли ваша символическая ссылка на путь без действительного объекта файловой системы.

Вероятно, то, что вы действительно хотите, это что-то вроде

ln -s ../dir1/file.txt ./dir2/file.txt

Похоже? Эта команда создает символическую ссылку с собственным путем ./dir2/file.txt , а ее целью является буквальный относительный путь ../dir1/file.txt . Последний абсолютный путь, на который указывает символическая ссылка: ~/dir2/../dir1/file.txt , который преобразуется в ~/dir1/file.txt .

Обратите внимание, что символ ~ - это расширяемый символ оболочки, который расширяется до абсолютного пути вашего домашнего каталога. Расширение ~ не является частью разрешения пути ОС.

Предлагаемое чтение

Руководства Linux по path_resolution(7) , symlink(7) , ln(1) и ln(1p) .

редактировать

Разъяснения и рекомендуемое чтение.

1

Вы можете сделать любой из

  1. Используйте абсолютные пути

    $ ln -s ~/dir1/file.txt ~/dir2
    $ readlink dir2/file.txt 
    /home/terdon/dir1/file.txt
    
  2. Используйте правильные относительные пути

    $ ln -s ../dir1/file.txt dir2/
    $ readlink dir2/file.txt 
    ../dir1/file.txt
    

В зависимости от вашего варианта использования, один может быть лучше, чем другой. Просто помните, что при создании ссылок с использованием относительных путей, пути должны быть относительно цели, а не вашего текущего местоположения.

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