Команда ln

Команда ln позволяет задействовать одноименную утилиту, предназначенную для создания жестких и символьных ссылок. Жесткие ссылки привязываются к содержимому файлов (а точнее, к структурам inode), по своей сути являются дополнительными именами файлов и могут создаваться в лишь пределах отдельных файловых систем. В то же время, символьные ссылки привязываются к именам элементов файловых систем, поэтому они могут указывать даже на директории и не ограничены отдельными файловыми системами. Кроме того, в случае удаления целевых файлов символьные ссылки могут становиться некорректными. Хотя подавляющему большинству пользователей едва ли придется самостоятельно создавать ссылки на файлы или директории, следует уметь как минимум создавать символьные ссылки, так как они максимально похожи на ссылки на файлы в ОС Windows.

Базовый синтаксис команды выглядит следующим образом:

$ ln [параметры] имя-целевого-файла имя-ссылки

Утилита поддерживает большое количество параметров, причем многие из этих параметров являются узкоспециализированным и едва ли пригодятся большинству пользователей. По умолчанию утилита создает жесткую символьную ссылку на файл с указанным именем. Если необходимо создать символьную ссылку, следует использовать параметр -s. Существует несколько параметров, регулирующих поведение утилиты в случае наличия файлов с именами, совпадающими с именами создаваемых ссылок. Так, параметр -b позволяет создать резервную копию присутствующего в системе файла (добавив символ ~ в конец его имени), параметр -f — принудительно перезаписать такой файл, а параметр -i — спросить о необходимом действии пользователя, то есть, задействовать интерактивный режим. Также в некоторых случаях может оказаться полезным параметр -v, позволяющий выводить подробную информацию обо всех действиях утилиты.

Что касается файловых менеджеров, то они отмечают специальным образом лишь символьные ссылки.

Manager

В данном случае file-hard-link.txt - жесткая ссылка на текстовый файл, file-symbolic-link.txt - символьная ссылка на него же. 

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

Создание жестких ссылок на файлы

Для примера рассмотрим следующую ситуацию: два текстовых файла находятся в директории files, а пользователю нужно создать ссылки на эти файлы в директории уровнем выше.
$ tree
.
└── files
    ├── file2.txt
    └── file.txt

1 directory, 2 files

Для создания жесткой ссылки на файл достаточно указать имя файла и имя ссылки:

$ ln files/file.txt file.txt

В результате ссылка появится в текущей директории:

$ tree
.
├── files
│   ├── file2.txt
│   └── file.txt
└── file.txt

1 directory, 3 files

Так как была создана жесткая ссылка, утилита ls не обозначит ее соответствующим образом, ведь она по своей сути является дополнительным именем файла:

$ ls -l file.txt
-rw-rw-r-- 3 alex alex 9 окт 11 2014 file.txt

Чтобы удостовериться в том, что жесткие ссылки не могут создаваться между отдельными файловыми системами, достаточно попытаться создать ссылку на этот же файл в директории /tmp:

$ ln files/file.txt /tmp/file.txt
ln: не удалось создать жёсткую ссылку '/tmp/file.txt' => 'files/file.txt': Неверная ссылка между устройствами

Сообщение об ошибке подтверждает данное утверждение.

Для того, чтобы убедиться в том, что жесткая ссылка является дополнительным именем файла можно попробовать удалить исходный файл:

$ cat files/file.txt
Just test
$ cat file.txt
Just test
$ unlink files/file.txt
$ tree
.
├── files
│   └── file2.txt
└── file.txt

1 directory, 2 files
$ cat file.txt
Just test

Очевидно, что содержимое файла все еще доступно благодаря существованию жесткой ссылки.

В случае необходимости удаления жестких ссылок следует действовать по аналогии с обычными файлами:

$ unlink file.txt
$ tree
.
└── files
    └── file2.txt

1 directory, 1 file

Жесткая ссылка была удалена.

Создание символьных ссылок на файлы

Рассмотрим аналогичную ситуацию, но в данном случае будем использовать файл file2.txt и создавать символьные ссылки.

$ tree
.
└── files
    └── file2.txt

1 directory, 1 file

Для создания символьной ссылки следует использовать параметр -s, а также указать имя целевого файла и символьной ссылки:

$ ln -s files/file2.txt file2.txt

В результате ссылка появится в текущей директории, причем она будет обозначена соответствующим образом:

$ tree
.
├── file2.txt -> files/file2.txt
└── files
    └── file2.txt

1 directory, 2 files

Утилита ls также обозначит ее:

$ ls -l file2.txt
lrwxrwxrwx 1 alex alex 15 фев 11 12:58 file2.txt -> files/file2.txt

Обратите внимание на букву l в первом поле.

Символьные ссылки не ограничены файловыми системами; для того, чтобы убедиться в этом, достаточно создать символьную ссылку на файл в директории /tmp:

$ ln -s files/file2.txt /tmp/file2.txt
$ ls -l /tmp/file2.txt
lrwxrwxrwx 1 alex alex 15 фев 11 13:03 /tmp/file2.txt -> files/file2.txt

Очевидно, что ссылка успешно создалась и указывает на корректный файл.

Для того, чтобы убедиться в возможности повреждения символьной ссылки, можно попробовать удалить исходный файл:

$ cat files/file2.txt
Just test
$ cat file2.txt
Just test
$ unlink files/file2.txt
$ tree
.
├── file2.txt -> files/file2.txt
└── files

1 directory, 1 file
$ cat file2.txt
cat: file2.txt: Нет такого файла или каталога

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

В случае необходимости удаления символьных ссылок также следует действовать по аналогии с обычными файлами:

$ unlink file2.txt
$ tree
.
└── files

1 directory, 0 files

Символьная ссылка была удалена.