Linux утилита ln

Как в linux сделать ссылку между файлами? Что такое жесткая ссылка? Что такое символьная ссылка и в чем её отличие от жесткой? Как создать символьную ссылку в linux? Об этом мы поговорим, рассказывая о linux утилите ln.

Описание утилиты ln

Linux утилита ln позволяет создавать ссылки между файлами и каталогами. Полную документацию по команде ln можно посмотреть на официальной странице.

Использование команды ln

ln [OPTION] … [-T] TARGET LINK_NAME.

В данном случае ln создает ссылку на файл TARGET с именем LINK_NAME. Для примера создадим простой текстовый файл:

$ echo 'PocketAdmin' > test.txt

Чтобы на файл test.txt создать ссылку с именем test.txt.link необходимо выполнить:

$ ln test.txt test.txt.link

Проверим, что у нас получилось:

$ ls -l
total 8
-rw-rw-r--. 2 user user 12 Oct 20 13:29 test.txt
-rw-rw-r--. 2 user user 12 Oct 20 13:29 test.txt.link

Если теперь посмотреть содержимое файла test.txt.link, то увидим, что оно аналогично исходному:

$ cat test.txt.link 
PocketAdmin

Надо отметить, что по умолчанию ln создает жесткие ссылки – это ссылки на файл (создавать жесткие ссылки на директории нельзя), которые обладают следующими особенностями:

  • имеют такие же права и разрешения, что и у исходного файла
  • права и разрешения у жесткой ссылки изменяются вместе с правами и разрешениями исходного файла
  • переименование, перемещение и удаление файла не влияют на жесткие ссылки

ln [OPTION] … TARGET

Данный пример аналогичен предыдущему, но имя ссылки не указывается – оно будет таким же как у исходного файла. При этом сама ссылка будет создана в текущем каталоге.

ln [OPTION] … TARGETDIRECTORY
ln [OPTION] … -t DIRECTORY TARGET

В последних двух случаях Linux утилита ln создаст ссылки для каждой TARGET в DIRECTORY. Для примера создадим директорию include в текущем каталоге:

$ mkdir include

У нас получится следующая структура:

ls -l
total 8
drwxrwxr-x. 2 user user  6 Oct 20 13:36 include
-rw-rw-r--. 2 user user 12 Oct 20 13:29 test.txt
-rw-rw-r--. 2 user user 12 Oct 20 13:29 test.txt.link

Теперь мы можем создать для обоих файлов test.txt и test.txt.link ссылки в директории include одной командой:

ln test.txt test.txt.link include/

Проверим содержимое этой директории:

$ ls -l include/
total 8
-rw-rw-r--. 4 user user 12 Oct 20 13:29 test.txt
-rw-rw-r--. 4 user user 12 Oct 20 13:29 test.txt.link

Параметры утилиты ln

Linux команда ln может принимать следующие опции:

-b – сделать резервное копирование файла
Приведем пример. Если мы попытаемся повторно сделать ссылку из первого пример, то получим предупреждение, что файл уже существует:

$ ln test.txt test.txt.link
ln: failed to create hard link 'test.txt.link': File exists

Если же мы используем опцию -b, то ссылка будет создана, а старая скопирована с добавлением суффикса ~:

$ ln -b test.txt test.txt.link

$ ls -l
total 12
drwxrwxr-x. 2 user user 43 Oct 20 13:39 include
-rw-rw-r--. 5 user user 12 Oct 20 13:29 test.txt
-rw-rw-r--. 5 user user 12 Oct 20 13:29 test.txt.link
-rw-rw-r--. 5 user user 12 Oct 20 13:29 test.txt.link~

-d, -F, –directory – позволяет пользователю с правами root попытаться создать жесткую ссылку на директорию (но возможно стандартное предупреждение, об ошибке создания жестких ссылок на директорию)
-f, –force – удаляет существующий файл назначения, т.е. ошибка вида ln: failed to create hard link ‘test.txt.link’: File exists показана не будет
-i, –interactive – интерактивный режим, позволяет уточнить, требуется ли удалять существующий файл:

$ ln -i test.txt test.txt.link
ln: replace 'test.txt.link'?

-L, –logical – разыменование целей, которые являются символическими ссылками
-n, –no-dereference – рассматривает LINK_NAME как обычный файл, если это символическая ссылка на директорию
-P, –physical – делает жесткую ссылку на непосредственно символическую ссылку
-s, –symbolic (игнорируются опции -L и -P) – делает символическую ссылку, вместо жесткой. Символическая / символьная ссылка – это файл, который вместо данных содержит путь к файлу, на который он ссылается. Символическая ссылка (в отличии от жесткой) не ограничена одной файловой системой и может ссылаться на каталоги. При этом, если удалить файл, на который ссылается ссылка, то она станет битой, а данные – недоступны. Для примера создадим символьную ссылку на наш каталог include:

$ln -s include/ include2

$ ls -l
total 12
drwxrwxr-x. 2 user user 43 Oct 20 13:39 include
lrwxrwxrwx. 1 user user  8 Oct 20 15:22 include2 -> include/

-S, –suffix=SUFFIX – изменение суффикса в имени файлов, которые были созданы с помощью опции -b. Вместо ~ мы можем указать свой суффикс.
-t, –target-directory=DIRECTORY – указать каталог, в котором будут созданы ссылки (по умолчанию текущая директория)
-T, –no-target-directory – рассматривает LINK_NAME как обычный файл
-v, –verbose – при создании вывести наименования всех ссылок:

$ ln -v test.txt test.txt.link
'test.txt.link' => 'test.txt'

–help – вывести справку по утилите и выйти
–version – вывести информацию о версии и выйти

$ ln --version
ln (GNU coreutils) 8.30

Ещё больше полезных Linux-утилит вы можете найти на данной странице.