Вопрос или проблема
Мне нужно создать символическую ссылку, которая разрешается относительно каталога, в котором она находится. Какая команда используется для создания такой ссылки?
- Перейдите в каталог, в котором хотите создать ссылку
- Выполните команду
ln -s ../some/other/file linkname
Путь, который вы указываете, сохраняется с файлом. Когда вы обращаетесь к файлу, сохраняемый путь ищется и расширяется относительно файла. Система не знает, в каком каталоге вы находились, когда создали ссылку.
Недавние версии GNU coreutils (>= 8.16) поддерживают опцию --relative
(или -r
), что означает, что вы можете вызывать ln -s
с двумя абсолютными или относительными (относительно вашего рабочего каталога) путями, и она сама определит правильный относительный путь, который должен быть записан в символическую ссылку.
Вам нужно понять, что символическая ссылка больше похожа на текстовый файл, чем на запись каталога, которая содержит файл. Итак, если вы
echo ../poo >/file/name
то это вполне похоже на
ln -s ../poo /file/name
Система не заботится о том, существует ли /file/../poo
, это просто кусок текста, который помещается в символическую ссылку. Когда что-то пытается открыть символическую ссылку, именно тогда система пытается разрешить её.
Если вы используете оболочку с автозаполнением имен файлов, эта функция может запутать ситуацию, позволяя вам завершать имя файла относительно вашего текущего рабочего каталога, даже если в итоге вы используете это в качестве цели символической ссылки в совершенно другом каталоге.
Я хотел бы подробнее объяснить, как создать символическую ссылку с использованием относительных путей (с подробным примером).
Как упомянул Игнасио Васкес-Абрамс в комментариях, вы должны указать местоположение файла/папки относительно того, где будет создана символическая ссылка, а не относительно вашего текущего каталога.
ПРИМЕР
Вы находитесь в /usr/share/nginx/html/_src/learn
Вы создадите символическую ссылку coding
в /usr/share/nginx/html
Создание относительной символической ссылки (теория):
sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location
Создание фактической относительной символической ссылки:
sudo ln -s ./_src/learn/coding ../../coding
Дополнительная информация (тот же пример)
текущий путь: /usr/share/nginx/html/_src/learn
символическая ссылка (будет создана) относительно текущего пути: ../../coding
расположение символической ссылки (абсолютное): /usr/share/nginx/html/coding
папка/файл относительно расположения символической ссылки: ./_src/learn/coding
абсолютный путь к папке/файлу: /usr/share/nginx/html/_src/learn/coding
Относительные ссылки были для меня сложными в OS X, т.е.
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin
оба не работали (что-то создавалось, но это не была директория). Я создал желаемую ссылку, используя абсолютные пути.
~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin
Предположим, у вас есть следующая структура каталогов:
/project
├── dir1/
│ └── file.txt
└── dir2/
Вы хотите создать символическую ссылку в /project/dir2, которая указывает на /project/dir1/file.txt
Если вы используете ln -r
, он автоматически рассчитает правильный относительный путь для вас, даже если вы указываете абсолютные пути:
ln -sr /project/dir1/file.txt /project/dir2/link.txt
Это создаёт символическую ссылку /project/dir2/link.txt, которая внутри указывает на ../dir1/file.txt.
Ответ или решение
Как создать относительную символическую ссылку в Linux?
Создание символических ссылок в Linux — это мощный инструмент, позволяющий ссылаться на файлы и каталоги, не копируя их физически. Есть два типа символических ссылок: абсолютные и относительные. В данной статье мы подробно рассмотрим, как создать относительные символические ссылки, а также теоретические и практические аспекты этого процесса.
Теоретическая база
Символическая ссылка — это специальный тип файла, который содержит текстовую запись пути к другому файлу или каталогу. При создании относительной символической ссылки путь сохраняется относительно местоположения самой ссылки, а не рабочего каталога, в котором была выполнена команда.
Важные аспекты:
-
Относительные пути: Чтобы создать относительную ссылку, вам нужно указать путь к целевому файлу или каталогу относительно директории, где будет создана ссылка. Это означает, что даже если вы находитесь в другом каталоге, ссылка должна быть создана на основе местоположения, в котором она будет размещена.
-
Инструмент
ln
: Для создания символических ссылок в Linux используется командаln
. Опция-s
указывает на то, что мы создаем символическую ссылку. -
Опция
--relative
: С недавних пор в GNU coreutils (версии 8.16 и выше) добавлена опция--relative
(или-r
). Эта опция автоматически вычисляет правильный относительный путь для ссылки на основе указанных абсолютных или относительных путей.
Порядок действий по созданию относительной символической ссылки
- Перейдите в каталог, в котором вы хотите разместить символическую ссылку.
- Используйте команду
ln -s
с указанием относительного пути к целевому файлу. Например:ln -s ../some/other/file linkname
Пример из практики
Допустим, у вас есть следующая структура директорий:
/project
├── dir1/
│ └── file.txt
└── dir2/
Вам необходимо создать символическую ссылку в каталоге /project/dir2
, которая будет указывать на файл /project/dir1/file.txt
.
Шаги выполнения:
-
Перейдите в
dir2
:cd /project/dir2
-
Создайте относительную ссылку:
ln -s ../dir1/file.txt link.txt
Теперь внутри dir2
будет символическая ссылка link.txt
, указывающая на ../dir1/file.txt
.
Альтернативный способ с использованием --relative
Если вы хотите создать ссылку, используя абсолютные пути со свёрнутым путем, вы можете воспользоваться опцией --relative
:
ln -sr /project/dir1/file.txt /project/dir2/link.txt
Эта команда автоматически создаст относительную символическую ссылку, которая будет указывать на ../dir1/file.txt
.
Заключение
Создание относительных символических ссылок в Linux — это полезный навык, позволяющий легко организовывать и управлять файлами. Понимание относительных и абсолютных путей, а также работы с командой ln
и ее опциями значительно упростит этот процесс. Используйте указанные советы и примеры, чтобы эффективно создавать символические ссылки в своих проектах и улучшайте свою работу с файловой системой Linux.