Жесткие ссылки на каталог разрушают файловую систему несколькими способами
Они позволяют вам создавать циклы
Жесткая ссылка на каталог может ссылаться на родительский каталог самого себя, что создает цикл файловой системы. Например, эти команды могут создавать цикл с обратной ссылкой l
:
mkdir -p /tmp/a/bcd /tmp/a/bln -d /tmp/a l
Файловая система с циклом каталогов имеет бесконечную глубину:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Избежать бесконечного цикла при обходе такой структуры каталогов несколько сложно (хотя, например, POSIX требует find
чтобы избежать этого).
Файловая система с такой жесткой связью больше не является деревом, потому что дерево по определению не должно содержать цикл.
Они нарушают однозначность родительских каталогов
При цикле файловой системы существует несколько родительских каталогов:
cd /tmp/a/bcd /tmp/a/b/l/b
В первом случае, /tmp/a
является родительским каталогом /tmp/a/b
.
Во втором случае, /tmp/a/b/l
является родительским каталогом /tmp/a/b/l/b
, что то же самое , что /tmp/a/b
.
Таким образом, у него есть два родительских каталога.
Они размножают файлы
Файлы идентифицируются по путям после разрешения символических ссылок. Так
/tmp/a/b/foo.txt/tmp/a/b/l/b/foo.txt
это разные файлы.
Существует бесконечно много дополнительных путей к файлу. Конечно, они одинаковы с точки зрения их номера индекса. Но если вы явно не ожидаете циклов, нет никаких причин проверять это.
Жесткая ссылка на каталог также может указывать на дочерний каталог или каталог, который не является ни дочерним, ни родительским какой-либо глубины. В этом случае файл, являющийся дочерним элементом ссылки, будет реплицирован в два файла, идентифицируемых двумя путями.
Ваш пример
$ ln /Some/Direcoty /home/nischay/Hard-Directory$ echo foo > /home/nischay/Hard-Directory/foobar.txt$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt$ echo bar >> /Some/Direcoty/foobar.txt$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt$ cat /Some/Direcoty/foobar.txtfoobar
Как тогда могут работать мягкие ссылки на каталоги?
Путь, который может содержать программные ссылки и даже циклы каталогов с программными ссылками, часто используется только для идентификации и открытия файла. Его можно использовать как обычный линейный путь.
Но есть и другие ситуации, когда пути используются для сравнения файлов. В этом случае символические ссылки в пути могут быть сначала разрешены, преобразовав его в минимальный, и общепринятое представление , создающее канонический путь:
Это возможно, потому что все программные ссылки могут быть расширены до путей без ссылки. После выполнения этого со всеми мягкими ссылками в пути оставшийся путь является частью дерева, где путь всегда однозначен.
Команда readlink
может разрешить путь к его каноническому пути:
$ readlink -f /some/symlinked/path
Программные ссылки отличаются от того, что использует файловая система
Программная ссылка не может вызвать всех проблем, потому что она отличается от ссылок внутри файловой системы. Его можно отличить от жестких ссылок и при необходимости преобразовать в путь без символических ссылок.
В некотором смысле добавление символических ссылок не изменяет базовую структуру файловой системы - оно сохраняет ее, но добавляет больше структуры, такой как прикладной уровень.
От man readlink
:
NAME readlink - print resolved symbolic links or canonical file names SYNOPSIS readlink [OPTION]... FILE... DESCRIPTION Print value of a symbolic link or canonical file name -f, --canonicalize canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist [ ... ]