Символическая ссылка в Linux: команда ln -s и жёсткие ссылки
Символическая ссылка в Linux создаётся командой ln -s ЦЕЛЬ ИМЯ, например ln -s /opt/app/bin/app ~/.local/bin/app: сначала существующий файл, потом имя ссылки. Ниже разобраны относительные пути, замена через ln -sfn, безопасное удаление, поиск битых ссылок и жёсткие ссылки.

Содержание
Символическая и жёсткая ссылка: в чём разница
В Linux у файла есть данные на диске, описанные инодом (inode), и имя в каталоге, которое на этот инод указывает. Отсюда два вида ссылок.
- Символическая ссылка (symlink, мягкая ссылка) - отдельный маленький файл, внутри которого записан путь к цели. Похожа на ярлык в Windows. Удалили цель - ссылка осталась, но ведёт в никуда.
- Жёсткая ссылка (hard link) - второе имя того же инода. Оба имени равноправны, ни одно не главное. Данные исчезнут, только когда удалено последнее имя.
В выводе ls -l символическая ссылка начинается с буквы l и показывает цель после стрелки. Жёсткую ссылку так не отличить: это обычный файл, у которого во втором столбце счётчик ссылок больше единицы.
ls -l /usr/bin/python3
# lrwxrwxrwx 1 root root 10 ... /usr/bin/python3 -> python3.13Права lrwxrwxrwx у симлинка ничего не значат: при обращении проверяются права цели. Поэтому chmod на ссылку меняет права файла, на который она указывает.
Как создать символическую ссылку: ln -s
Синтаксис легко перепутать, поэтому запомните порядок как у cp: сначала то, что уже существует, потом новое имя.
# ln -s ЦЕЛЬ ИМЯ_ССЫЛКИ
ln -s /home/user/projects/site/public ~/site
# ссылка на файл в текущем каталоге с тем же именем
ln -s /etc/nginx/sites-available/example.conf
# ссылка в каталог: несколько целей сразу
ln -s /opt/app/bin/app /opt/app/bin/appctl ~/.local/bin/
# проверить результат
ls -l ~/siteЕсли второй аргумент не указан, ссылка появится в текущем каталоге с именем цели. Если второй аргумент - существующий каталог, ссылка будет создана внутри него. Права на запись нужны в каталоге, где создаётся ссылка, а не на цель: для /usr/local/bin понадобится sudo, о правах подробнее в статье про chmod и chown.
Абсолютный или относительный путь
Путь цели записывается в ссылку как есть, без проверки. Относительный путь считается от каталога, где лежит ссылка, а не от того, где вы стоите в терминале. Классическая ошибка:
cd ~
ln -s docs/report.pdf backup/report.pdf
# ссылка backup/report.pdf ищет backup/docs/report.pdf и оказывается битойДва надёжных варианта: давать абсолютный путь или поручить пересчёт самой команде ключом -r (--relative). Относительные ссылки удобны, когда каталог целиком переезжает или копируется на другой диск: связи внутри него не ломаются.
ln -sr ~/docs/report.pdf ~/backup/report.pdf
ls -l ~/backup/report.pdf
# report.pdf -> ../docs/report.pdfКак перенаправить существующую ссылку
Повторный ln -s на занятое имя закончится ошибкой File exists. Для замены есть -f, а для ссылок на каталоги в паре с ним нужен -n:
# переключить current на новую версию приложения
ln -sfn /opt/app/releases/2026-10-20 /opt/app/currentБез -n команда увидит, что /opt/app/current указывает на каталог, зайдёт в него и создаст там вложенную ссылку 2026-10-20, а старая останется как была. Это частая причина того, что после деплоя ничего не поменялось. Схему с каталогом releases и ссылкой current применяют для быстрого отката: вернуть прошлую версию значит выполнить ту же команду со старым путём.
Ключ -i спросит подтверждение перед перезаписью, -b сохранит старый файл с тильдой в конце имени, -v выведет, что именно создано.
Жёсткие ссылки: ln без -s
Без ключа -s команда ln создаёт жёсткую ссылку. Проверить, что оба имени указывают на один инод, помогает ls -li: номер в первом столбце совпадёт.
ln /data/video/raw.mkv /data/archive/raw.mkv
ls -li /data/video/raw.mkv /data/archive/raw.mkv
# сколько имён у файла
stat -c %h /data/video/raw.mkv
# найти все имена этого файла в пределах файловой системы
find /data -samefile /data/video/raw.mkvОграничения жёстких ссылок:
- Только внутри одной файловой системы. На другой раздел будет ошибка
Invalid cross-device link. - Нельзя на каталоги, даже root получит
hard link not allowed for directory. - При включённом по умолчанию
fs.protected_hardlinks=1обычный пользователь не может создать жёсткую ссылку на чужой файл, к которому у него нет права записи.
Где они полезны: экономия места при хранении одинаковых файлов (так работают снимки в rsnapshot и rsync --link-dest, см. статью про rsync), и защита от случайного удаления, ведь стереть одно имя не значит стереть данные.
Сравнение символических и жёстких ссылок
| Свойство | Символическая | Жёсткая |
|---|---|---|
| Что хранит | Путь к цели | Тот же инод, второе имя |
| Другой раздел или диск | Можно | Нельзя |
| Ссылка на каталог | Можно | Нельзя |
| Если удалить оригинал | Ссылка становится битой | Данные доступны по второму имени |
| Переименование цели | Ломает ссылку | Не влияет |
| Как отличить в ls -l | Буква l и стрелка -> | Счётчик ссылок больше 1 |
| Создание | ln -s цель имя | ln цель имя |
На практике в девяти случаях из десяти нужен симлинк: он понятен, виден в ls и работает между разделами. Жёсткая ссылка - инструмент для бэкапов и дедупликации.
Как удалить ссылку и не задеть данные
Ссылка удаляется как обычный файл, цель не трогается:
rm ~/site
# или
unlink ~/siteОпасность в одном символе. Если ссылка указывает на каталог, не ставьте слеш в конце и не используйте -r: команда rm -r ~/site/ пойдёт по ссылке и удалит содержимое настоящего каталога. Без слеша rm ~/site удаляет только саму ссылку, а rm без -r на каталог через слеш просто откажется работать. unlink ещё безопаснее: он удаляет ровно одно имя и не принимает ключей.
Перед удалением чего-либо подозрительного в системных каталогах выполните ls -ld путь без слеша на конце. Буква l в начале строки значит, что это ссылка, и удалять её безопасно, если она больше не нужна.
Жёсткая ссылка удаляется так же rm. Данные освободятся, когда счётчик дойдёт до нуля и файл не будет открыт ни одним процессом.
Как найти битые символические ссылки
Битая ссылка указывает на несуществующий путь. В цветном ls она обычно подсвечена красным. Для поиска по дереву каталогов используйте find:
# битые ссылки в домашнем каталоге (GNU find)
find ~ -xtype l
# то же для любой реализации find
find ~ -type l ! -exec test -e {} \; -print
# посмотреть, куда они вели
find ~ -xtype l -exec ls -l {} +
# удалить найденное (сначала запустите без -delete)
find ~ -xtype l -deleteКлюч -xtype l отбирает ссылки, которые после разыменования остаются ссылками, то есть никуда не ведут. Не запускайте удаление по / целиком: в /proc и некоторых каталогах программ битые ссылки бывают нормой. Ограничивайте поиск ключом -xdev и конкретным путём. Больше приёмов с find в статье о поиске файлов через find и grep.
Куда на самом деле ведёт ссылка
# путь, записанный в ссылке
readlink ~/site
# полный конечный путь через цепочку ссылок
readlink -f ~/site
realpath ~/site
# подробно: тип, инод, цель
stat ~/siteГде ссылки встречаются в системе
- systemd.
systemctl enableсоздаёт симлинки юнитов в/etc/systemd/system/*.wants/, аdisableих удаляет. Подробности в статье про systemctl. - Альтернативы Debian и Ubuntu.
/usr/bin/editorведёт в/etc/alternatives/editor, а оттуда в nano или vim. Переключение черезsudo update-alternatives --config editor. - Слияние /usr. В современных Debian, Ubuntu, Fedora и Arch каталоги
/bin,/sbinи/libсами являются ссылками в/usr. - Свои программы. Скачанный бинарник удобно держать в
/opt, а в~/.local/binположить на него ссылку, чтобы команда была в PATH (см. про PATH). - Dotfiles. Конфиги хранят в git-репозитории и раскладывают ссылками в домашний каталог.
Подводные камни
На FAT32 и exFAT символических ссылок нет, попытка закончится Operation not permitted, а при копировании на флешку cp -r копирует содержимое цели. Архиваторы и cp -a, наоборот, сохраняют ссылки как ссылки. В Ubuntu 26.04 утилита ln входит в rust-coreutils (uutils) вместо GNU coreutils; основные ключи -s, -f, -n, -r работают так же, а какая реализация стоит у вас, покажет ln --version. Полный список ключей есть в руководстве GNU Coreutils.
Ссылки при копировании и архивации
Утилиты по-разному решают, копировать ссылку или файл, на который она указывает. Если после переноса каталога на другой сервер ссылки оказались битыми или, наоборот, архив раздулся, дело в этих ключах:
# cp: -P копирует ссылку как ссылку, -L копирует содержимое цели
cp -aP src/ dst/
cp -rL src/ dst/
# rsync: -l сохраняет ссылки (входит в -a), -L заменяет их файлами
rsync -a src/ dst/
rsync -aL src/ dst/
# tar по умолчанию хранит ссылки, -h кладёт в архив сами файлы
tar -czf site.tar.gz site/
tar -czhf site-full.tar.gz site/Про сами архивы подробнее в статье о tar и zip.
Частые вопросы
Как создать ссылку на папку в Linux?
Так же, как на файл: ln -s /путь/к/папке ~/имя_ссылки. Жёсткую ссылку на каталог создать нельзя, только символическую.
Что будет со ссылкой, если удалить исходный файл?
Символическая ссылка станет битой и будет вести в никуда. Жёсткая продолжит работать, потому что данные удаляются вместе с последним именем.
Как удалить символическую ссылку на каталог?
Командой rm имя или unlink имя без слеша на конце. С rm -r и слешем удалится содержимое настоящего каталога.
Почему ln -s создал битую ссылку?
Чаще всего из-за относительного пути: он считается от каталога ссылки, а не от текущего. Используйте абсолютный путь или ключ -r.
Как узнать, куда ведёт ссылка?
ls -l покажет записанный путь после стрелки, readlink -f или realpath выдадут конечный путь через всю цепочку ссылок.
Документация и источники
- GNU Coreutils: ln invocation, GNU Project, 2026
- symlink(7), Linux man-pages, 2026
- find(1) man page, GNU findutils, 2026
Читайте также
- Архивы в Linux: команды tar, zip и 7z с примерами
- Права доступа в Linux: chmod, chown и разбор Permission denied
- Поиск файлов в Linux: по имени, размеру, дате и содержимому
- rsync в Linux: синхронизация папок и резервные копии на примерах
- systemctl в Linux: управление службами и автозагрузкой
- Переменные окружения и PATH в Linux: как добавить путь навсегда
Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.