В Linux команда ln
(link) используется для создания жёсткой или символической ссылки на файлы (каталоги), позволяющей давать файлу сразу несколько имён.
Содержание
Введение
В файловой системе Linux файлы распознаются по номеру их индексного дескриптора (inode number). Этот номер является уникальным во всей файловой системе.
Каталог является лишь списком номеров индексных дескрипторов и соответствующих имён файлов. Каждое имя файла в каталоге связано с некоторым индексным дескриптором.
Синтаксис
$ ln [ПАРАМЕТР]… [-T] ЦЕЛЬ ИМЯ_ССЫЛКИ
Возможные варианты:
$ ln [ПАРАМЕТР]… ЦЕЛЬ
$ ln [ПАРАМЕТР]… ЦЕЛЬ... КАТАЛОГ
$ ln [ПАРАМЕТР]… -t КАТАЛОГ ЦЕЛЬ…
В первой форме создаётся ссылка на ЦЕЛЬ с указанным ИМЕНЕМ_ССЫЛКИ.
Во второй форме создаётся ссылка на ЦЕЛЬ в текущем каталоге.
В третьей и четвёртой формах создаются ссылки на каждую ЦЕЛЬ в КАТАЛОГЕ.
По умолчанию создаются жёсткие ссылки, а с параметром --symbolic — символьные.
По умолчанию, каждая цель (имя новой ссылки) не должна существовать.
При создании жёстких ссылок каждая ЦЕЛЬ должна существовать.
Символьные ссылки могут содержать произвольный текст; при разыменовании относительная ссылка интерпретируется относительно родительского каталога.
Параметры
- --backup[=КОНТРОЛЬ]
- Создать резервную копию для каждого целевого файла
- -b
- То же, что и --backup, но не принимает аргумент
- -d, -F, --directory
- Позволить суперпользователю создавать жёсткие ссылки на каталоги (вероятно, это может не получиться из-за системных ограничений, даже для суперпользователя)
- -f, --force
- Удалять существующие целевые файлы
- -i, --interactive
- Спрашивать перед удалением целей
- -L, --logical
- Разыменовывать ЦЕЛИ, являющиеся символьными ссылками
- -n, --no-dereference
- Рассматривать ИМЯ_ССЫЛКИ, как обычный файл, если это символьная ссылка на каталог
- -P, --physical
- Создавать жёсткие ссылки непосредственно на символьные ссылки
- -r, --relative
- С -s, создавать ссылки относительно расположения ссылки
- -s, --symbolic
- Создавать символьные ссылки, вместо жёстких ссылок
- -S, --suffix=СУФФИКС
- Переопределяет обычный суффикс резервных копий
- -t, --target-directory=КАТ
- Указать КАТАЛОГ, в котором создавать ссылки
- -T, --no-target-directory
- Всегда считать ИМЯ_ССЫЛКИ обычным файлом
- -v, --verbose
- Печатать имя каждого файла при создании ссылки
- --help
- Показать эту справку и выйти
- --version
- Показать информацию о версии и выйти
По умолчанию суффикс для запасных копий ~
, если только не установлена переменная окружения SIMPLE_BACKUP_SUFFIX или не задан параметр --suffix
.
Способ контроля версий может быть установлен при помощи ключа --backup
или переменной окружения VERSION_CONTROL.
Допустимые значения:
- none, off
- Никогда не создавать резервных копий (даже если указан параметр
--backup
) - numbered, t
- Создавать нумерованные копии
- existing, nil
- Пронумеровать, если уже существуют пронумерованные резервные копии, иначе создавать простые
- simple. never
- Всегда создавать простые копии
При использовании параметра -s
игнорируются -L
и -P
. Иначе, последний параметр определяет поведение, когда ЦЕЛЬЮ является символьная ссылка, по умолчанию -P
.
Использование команды ln в Linux
Жёсткие ссылки
В текущем каталоге имеется файл с именем foo
. Увидеть соответствующий ему номер индексного дескриптора можно с помощью команды ls -i
:
$ ls -i foo
584794 foo
Файлу foo
соответствует индексный дескриптор номер 22192
файловой системы. К файлу foo
можно создать ещё одну ссылку и назвать её bar
. Для создания ссылки используется команда ln
:
$ ln foo bar
Команда ls -i
показывает, что оба файла относятся к одному и тому же индексному дескриптору:
$ ls -i foo bar
584794 bar 584794 foo
Теперь, обращаясь к файлу foo
или bar
, мы, в действительности, будем обращаться к одному и тому же файлу. Производя изменения в файле foo
, мы можем увидеть, что они появились также и в файле bar
. Со всех точек зрения файлы foo
и bar
— один и тот же файл.
Подобные ссылки называются жёсткими ссылками (hard links), поскольку они создают непосредственную связь с конкретным индексным дескриптором.
Отметим, что жёсткие ссылки можно создавать только тогда, когда файлы находятся в одной и той же файловой системе, в то время как символические ссылки не имеют таких ограничений.
При удалении файла командой rm
в действительности удаляется только одна ссылка на файл:
$ rm foo
В приведённом примере будет удалена только ссылка foo
, а ссылка bar
будет продолжать существовать. Файл будет удалён из файловой системы только тогда, когда на него не останется больше ссылок.
Команда ls -l
выдаёт (помимо прочей информации) число ссылок на каждый файл:
$ ls -l foo bar
-rw-r--r-- 2 oleg users 0 May 18 18:49 bar
-rw-r--r-- 2 oleg users 0 May 18 18:49 foo
В приведённом примере цифра 2
во второй колонке этого списка обозначает число ссылок на файл.
Отметим, что каталог в действительности представляет собой просто файл, содержащий информацию о связях (ссылках) между именами файлов и индексными дескрипторами.
Также каждый каталог содержит, как минимум, две жёстких ссылки: ссылка .
указывает на сам каталог, а ссылка ..
указывает на родительский каталог.
У корневого каталога /
ссылка ..
указывает на сам корневой каталог /
. Иными словами, родительским каталогом корневого каталога является тот же самый каталог.
Символические ссылки
С помощью символических ссылок (symbolic links) можно дать файлу другое имя, но не связывать файл с индексным дескриптором. Этим символические ссылки отличаются от жёстких ссылок.
Для создания символических ссылок используется команда ln -s
:
$ ln -s foo bar
В приведённом примере была создана символическая ссылка по имени bar
, указывающая на файл foo
.
Если мы выдадим список командой ls -i
, то увидим, что эти файлы имеют различные номера индексных дескрипторов:
$ ls -i foo bar
584785 bar 584706 foo
Однако, выдав список командой ls -l
, можно увидеть, что файл bar
является символической ссылкой, указывающей на файл foo
:
$ ls -l foo bar
lrwxrwxrwx 1 oleg users 3 May 18 19:18 bar -> foo
-rw-r--r-- 1 oleg users 0 May 18 19:17 foo
В символических ссылках не используются права доступа к файлу (иными словами, они всегда имеют форму rwxrwxrwx
).
В действительности, права доступа к символическим ссылкам определяются правами доступа к тому файлу, на который показывает символическая ссылка.
В нижеследующем примере показано содержимое каталога /usr/local/bin/
моей локальной машины:
oleg@mobile:~:$ ls -l /usr/local/bin/
итого 2380
-rwxr-xr-x 1 oleg users 2287395 ноя 29 2021 composer*
-rwxr-xr-x 1 root root 43416 июл 12 2021 dmenu*
-rwxr-xr-x 1 root root 240 июл 12 2021 dmenu_path*
-rwxr-xr-x 1 root root 58 июл 12 2021 dmenu_run*
lrwxrwxrwx 1 root root 52 ноя 30 2021 drush -> /home/oleg/.config/composer/vendor/drush/drush/drush*
-rwxr-xr-x 1 root root 61880 авг 17 2021 dwm*
lrwxrwxrwx 1 root root 23 апр 6 2022 FreeShip -> /home/oleg/bin/FreeShip*
-rwxr-xr-x 1 oleg users 843 авг 27 2021 n2dissite*
-rwxr-xr-x 1 oleg users 1080 авг 27 2021 n2ensite*
-rwxr-xr-x 1 root root 17080 июл 12 2021 stest*
lrwxrwxrwx 1 root root 18 мар 1 2022 tor -> /home/oleg/bin/tor*
lrwxrwxrwx 1 root root 34 окт 19 2022 yandex-browser -> /opt/yandex/browser/yandex-browser*
oleg@mobile:~:$
В операционной системе Linux особенно важны символические ссылки, указывающие на библиотеки общего пользования, находящиеся в каталоге /lib
.
Заключение
В этой статье показано насколько важно в Linux умение создавать и использовать команду ln
. Умение пользоваться этой утилитой окажет неоценимую помощь в дальнейшей вашей работе.