LinuxRuLinux без лишней теории
Файлы и каталоги

Символическая ссылка в Linux: команда ln -s и жёсткие ссылки

Редакция LinuxRu7 мин чтенияИнструкции

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

Символическая ссылка в Linux: команда ln -s и жёсткие ссылки
Фото: W.carter, CC0, Wikimedia Commons
Содержание
  1. Два вида ссылок
  2. Команда ln -s
  3. Изменить ссылку
  4. Жёсткие ссылки
  5. Сравнение
  6. Удалить ссылку
  7. Битые ссылки
  8. Где встречаются
  9. Частые вопросы

Символическая и жёсткая ссылка: в чём разница

В 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 выдадут конечный путь через всю цепочку ссылок.

Документация и источники

Читайте также

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