ln создаёт ссылки. Символическая ссылка (ln -s) — это маленький файл, внутри которого записан путь к цели, как ярлык. Жёсткая ссылка (ln без опций) — ещё одно имя того же файла: у обоих имён один inode и одно содержимое.
Синтаксис
ln -s цель имя_ссылки # символическая
ln цель имя_ссылки # жёсткая
ln -s цель… каталог/ # ссылки с теми же именами внутри каталога
ln -s -t каталог цель… # то же, каталог указан первым
Порядок как у cp: сначала то, на что ссылаешься, потом то, что создаёшь. Если имя ссылки не указано, она появится в текущем каталоге с именем цели.
Тип ссылки
| Опция | Что делает |
|---|
| (без опций) | жёсткая ссылка |
-s | символическая ссылка |
-r | записать в символическую ссылку путь относительно её каталога (вместе с -s) |
-L / -P | жёсткая ссылка на символическую: на её цель / на саму ссылку (по умолчанию -P) |
Если имя уже занято
| Опция | Что делает |
|---|
| (по умолчанию) | ошибка «File exists» |
-f | удалить существующий файл или ссылку и создать заново |
-i | спросить перед заменой |
-b | сохранить заменяемый файл с суффиксом ~; --backup=numbered — .~1~, .~2~… |
-n | если имя — ссылка на каталог, считать её файлом и заменять саму ссылку |
-T | считать имя ссылки обычным файлом, даже если это каталог: настоящий каталог не перезапишется |
Прочие опции
| Опция | Что делает |
|---|
-t каталог | создать ссылки в этом каталоге (удобно с xargs) |
-v | печатать каждую созданную ссылку |
Символическая или жёсткая
| Символическая | Жёсткая |
|---|
| На каталог | можно | нельзя |
| На другую файловую систему | можно | нельзя («Invalid cross-device link») |
| Цель удалили | ссылка «висит» и не открывается | данные живы, пока есть хоть одно имя |
| Переместили цель | ссылка ломается | не важно, это то же самое имя |
| Как увидеть | ls -l показывает имя -> цель, тип l | одинаковый inode в ls -li, счётчик ссылок больше 1 |
Как смотреть ссылки
| Команда | Что показывает |
|---|
ls -l | lrwxrwxrwx … имя -> цель; второе поле у файлов — число жёстких ссылок |
ls -li | номер inode в первой колонке |
readlink ссылка | путь, записанный в ссылку, как есть |
readlink -f ссылка / realpath | итоговый абсолютный путь после разыменования всех ссылок |
readlink -e ссылка | то же, но ошибка (код 1), если цель не существует |
stat -c '%N %h %i' файл | ссылка и цель / число жёстких ссылок / inode |
namei -l путь | каждый компонент пути с правами — где именно цепочка ссылок ломается |
Примеры
# символическая ссылка на конфиг
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# переключить ссылку на другую версию каталога
ln -sfn /srv/app/releases/v2 /srv/app/current
# относительная ссылка: путь пересчитается от места ссылки
ln -sr /srv/app/shared/config.yml /srv/app/current/config.yml
# куда указывает ссылка: как записано и итоговый путь
readlink /srv/app/current
readlink -f /srv/app/current
# ссылки на несколько программ в каталоге
ln -s -t /usr/local/bin /opt/tool/bin/tool /opt/tool/bin/tool-cli
# заменить файл ссылкой, сохранив старый как config.yml~
ln -sfb /srv/app/shared/config.yml config.yml
# жёсткая ссылка и проверка: один inode, счётчик ссылок 2
ln data.csv data-copy.csv
ls -li data.csv data-copy.csv
# найти «висячие» ссылки
find /etc -xtype l
# найти все имена одного файла
find / -xdev -samefile data.csv 2>/dev/null
Подводные камни
- Относительный путь считается от каталога ссылки, а не от текущего.
ln -s config.yml /srv/app/current/config.yml создаст ссылку на /srv/app/current/config.yml — саму себя («Too many levels of symbolic links»). Пиши абсолютный путь или используй -r.
ln -sf поверх ссылки на каталог не заменит её, а создаст новую ссылку внутри каталога-цели. Для переключения всегда пиши -sfn.
- Настоящий каталог
-f не заменит: «cannot overwrite directory». С -T команда тоже откажется — это защита.
- Без
-f существующее имя не перезаписывается: «File exists».
- Висячая ссылка выглядит нормально в
ls -l, но открыть её нельзя: «No such file or directory». Проверка: test -e ссылка ложна, test -L ссылка истинна.
- Права символической ссылки всегда
lrwxrwxrwx и ни на что не влияют — проверяются права цели.
- Жёсткая ссылка — не копия. Изменения через одно имя видны через другое. А редактор, который сохраняет файл через «записать новый и переименовать», разорвёт эту связь.
- Жёсткая ссылка на символическую по умолчанию копирует саму ссылку (
-P), а не файл. Нужна ссылка на файл — добавь -L.
См. также
find · stat · ls · cp · mv · chmod · tar