Жорсткі посилання каталогів розбивають файлову систему декількома способами
Вони дозволяють створювати петлі
Жорстке посилання на каталог може посилатися на сам батьків, який створює цикл файлової системи. Наприклад, ці команди можуть створити цикл із зворотним посиланням l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
Файлова система з циклом каталогів має нескінченну глибину:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Уникнути нескінченного циклу при переході до такої структури каталогів дещо складно (хоча, наприклад, POSIX вимагає find
цього уникати).
Файлова система з таким жорстким посиланням більше не є деревом, оскільки дерево, за визначенням, не повинно містити циклу.
Вони порушують однозначність батьківських каталогів
З циклом файлової системи існує декілька батьківських каталогів:
cd /tmp/a/b
cd /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
- це різні файли.
Існує нескінченно багато подальших шляхів файлу. Вони однакові з точки зору їх кількості inode, звичайно. Але якщо ви чітко не очікуєте циклів, немає підстав для цього перевірити.
Жорстке посилання каталогу також може вказувати на дочірній каталог або на каталог, який не є ані дочірнім, ані батьківським. У цьому випадку файл, який є дочірньою ланкою, буде реплікуватися у два файли, ідентифіковані двома шляхами.
Ваш приклад
$ 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.txt
foo
bar
Як тоді можуть працювати м'які посилання на каталоги?
Шлях, який може містити софтпосилання і навіть м'які пов'язані петлі каталогів, часто використовується лише для ідентифікації та відкриття файлу. Його можна використовувати як звичайний, лінійний шлях.
Але є й інші ситуації, коли шляхи використовуються для порівняння файлів. У цьому випадку символьні посилання на шляху можуть бути вирішені спочатку, перетворивши його на мінімальний , і зазвичай узгоджене уявлення, створюючи канонічний шлях :
Це можливо, тому що м'які посилання можуть бути розширені до шляхів без посилання. Зробивши це з усіма м'якими посиланнями на контуру, шлях, що залишився, є частиною дерева, де шлях завжди однозначний.
Команда 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
[ ... ]