
Как в 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] … TARGET … DIRECTORY
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-утилит вы можете найти на данной странице.