С чего начать Первые шаги трек · 15 ступеней
Linux Labs

ln — символические и жёсткие ссылки

4 мин GNU coreutils

Симлинки (ln -s) и жёсткие ссылки: чем отличаются, когда что, типичные ошибки с относительными путями.

Шпаргалка

5 команд Версия для печати
  • ln -s /opt/app/current/bin/app /usr/local/bin/app симлинк (порядок как у cp)
  • ln file hardname жёсткая ссылка
  • find . -xtype l найти битые симлинки

Обзор

Ссылка — это второе имя для файла. Два вида:

  • Символическая (symlink, ln -s) — указатель на путь. Может вести на каталог, на другую ФС, может «висеть» (битая, если цель удалили). Это самый частый случай.
  • Жёсткая (hard link) — ещё одно имя того же inode (тех же данных). Только в пределах одной ФС, только на файлы. Файл существует, пока есть хоть одно имя.

Ключи

6

-s — единственный ключ, который отличает симлинк от жёсткой ссылки; без него ln создаёт жёсткую. -f перезаписывает существующее имя ссылки — без подтверждения, поэтому опасно с чужими или важными файлами. -n нужен именно при замене симлинка, указывающего на каталог: без него ln -sf цель dir положит новую ссылку внутрь dir, а не заменит сам dir.

Ключ Что делает Пример
-s --symbolic Создать символическую ссылку вместо жёсткой. ln -s target link
-f --force Удалить существующий файл назначения и создать ссылку заново. опасно ln -sf target link
-n --no-dereference При замене symlink на каталог — не заходить внутрь, заменить сам симлинк. ln -sfn target linkdir
-v --verbose Печатать каждую созданную ссылку. ln -sv target link
-r --relative Создать символическую ссылку с относительным путём до цели. ln -sr target link
-T --no-target-directory Считать ИМЯ обычным файлом назначения, даже если это каталог. ln -sT target name

Ничего не найдено. Попробуй запрос короче.

Рецепты

2

Примеры

bash
ln -s /opt/app/current/bin/app /usr/local/bin/app   # симлинк (цель → имя ссылки)
ln -s ../shared config                              # относительный симлинк
ln -sf /new/target link                             # -f: пересоздать существующую ссылку
ln -sfn /new/dir linkdir                            # -n: не «зайти внутрь» симлинка-каталога при замене
readlink link                                       # куда указывает симлинк
readlink -f link                                    # абсолютный путь после всех симлинков
ls -l link                                          # видно стрелку: link -> target

# жёсткая ссылка (то же содержимое, тот же inode):
ln file hardname
stat -c '%i %h' file hardname                       # одинаковый inode, число ссылок 2

Порядок аргументов как у cp: сначала цель, потом имя ссылки (ln -s target name).

Симлинк vs хард

Симлинк (-s) Жёсткая ссылка
На каталог да нет
Между ФС да нет
Если удалить цель «битый» симлинк данные живы, пока есть имена
Видно в ls -l -> target как обычный файл
Свой inode да (отдельный) нет (тот же, что у файла)

Для конфигов, версий приложений, /etc/...wants/ у systemd — почти всегда симлинки.

Неполадки

3

Битый (висячий) симлинк

Цель переместили/удалили. ls -l покажет красным, readlink -f — пусто/ошибка. Найти все битые: find /path -xtype l.

Относительный симлинк «сломался» после перемещения

Относительный путь считается от каталога ссылки, не от текущего. Если двигаешь ссылку — пересчитай цель или используй абсолютный путь.

ln -s в существующий каталог создал ссылку ВНУТРИ него

Если ИМЯ — существующий каталог, ln -s цель dir положит ссылку в dir/цель. Чтобы заменить сам симлинк-каталог — добавь -n (ln -sfn цель dir).

См. также

  • files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
  • stat — Полная информация о файле: размер, права, владелец, времена (atime/mtime/ctime), inode.
  • systemd — Init-система и менеджер служб (PID 1): юниты, цели, зависимости, журналы.
Загрузка…