← Весь справочник

ln

Жёсткие и символические ссылки на файлы и каталоги

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 -llrwxrwxrwx … имя -> цель; второе поле у файлов — число жёстких ссылок
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