linux-labs

Вики / Базовые команды

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

Команда GNU coreutils БазовоеФайлы

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

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

  • Символическая (symlink, ln -s) — указатель на путь. Может вести на каталог, на другую ФС, может «висеть» (битая, если цель удалили). Это самый частый случай.
  • Жёсткая (hard link) — ещё одно имя того же inode (тех же данных). Только в пределах одной ФС, только на файлы. Файл существует, пока есть хоть одно имя.
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 ЦЕЛЬ ИМЯ).

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

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

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

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

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

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

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

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

ln -s ЦЕЛЬ ИМЯ           # симлинк (порядок как у cp)
ln -sf ЦЕЛЬ ИМЯ          # пересоздать
readlink -f link         # реальный путь
ln ФАЙЛ ИМЯ              # жёсткая ссылка
find . -xtype l          # найти битые симлинки

См. также