Вики / Базовые команды
ln — символические и жёсткие ссылки
Симлинки (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 # найти битые симлинки
См. также
- Базовые команды с файлами — Базовые команды
- stat — метаданные файла — Базовые команды
- systemd — Службы и systemd