it-swarm-ru.tech

Сделать символическую ссылку на относительный путь

Я могу сделать это:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

Но я хотел бы иметь возможность сделать это:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Это возможно? Можно ли как-то разрешить относительный путь и передать его ln?

65
Humphrey Bogart

Если вы создадите символическую ссылку на относительный путь, она сохранит ее как относительную символическую ссылку, а не как абсолютную, как показывает ваш пример. Это вообще хорошая вещь. Абсолютные символические ссылки не работают, когда файловая система смонтирована в другом месте.

Причина, по которой ваш пример не работает, заключается в том, что он относится к родительскому каталогу символической ссылки, а не к тому месту, где запускается ln.

Ты можешь сделать:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Или для этого имеет значение:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

Важно понимать, что первый аргумент после ln -s сохраняется как цель символической ссылки. Это может быть любая произвольная строка (с единственными ограничениями, что она не может быть пустой и не может содержать символ NUL), но во время использования и разрешения символической ссылки эта строка понимается как относительный путь к родительский каталог символической ссылки (если он не начинается с /).

66
penguin359

Если вы используете более новые coreutils (я использую coreutils-8.22-11), у него есть возможность сделать это:

ln --help | grep relative

может содержать произвольный текст; если разрешено позже, относительная ссылка - -r, --relative создать символические ссылки относительно расположения ссылки

Например:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from
25
ptr

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

12
Shadur

Есть удобная небольшая утилита под названием symlinks (первоначально от Mark Lords, теперь поддерживаемая J. Brandt Buckley), присутствующая во многих дистрибутивах Linux.

Чтобы преобразовать все абсолютные символические ссылки в каталоге в относительные:

symlinks -c /path/to/directory

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

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp
7

Вы можете попробовать:

ln -s `pwd`/bar.txt /home/beau/bar.txt

Но это делает символическую ссылку на абсолютный путь. Ваш текстовый вопрос просит упомянуть относительный путь ...

Обычно относительный путь - это то, что вы хотите и что ln -s дает тебе. Я думаю, что вы хотите, это:

cd /home/beau
ln -s foo/bar.txt bar.txt
3
MattBianco

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

Так же -s параметр означает --symbolic. ln создает жесткие ссылки по умолчанию.

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
1
emp.justine

Если вы уверены, что у вас нет шансов изменить точки монтирования, вы можете добиться того, что вы пытаетесь сделать, в командной оболочке bash, например:

ln -s `pwd`/bar.txt ~/bar.txt

Это предполагает, что вы находитесь в целевом каталоге при создании символической ссылки.

0
mreff555