Команда ln

Опубликовано admin - вт, 07/11/2023 - 16:10

В Linux команда ln (link) используется для создания жёсткой или символической ссылки на файлы (каталоги), позволяющей давать файлу сразу несколько имён.

Примеры использования команды ln в Linux

Содержание

Введение

В файловой системе 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. Умение пользоваться этой утилитой окажет неоценимую помощь в дальнейшей вашей работе.

Поделиться с друзьями