Le répertoire des liens physiques casse le système de fichiers de plusieurs façons
Ils vous permettent de créer des boucles
Un lien physique vers un répertoire peut être lié à un parent de celui-ci, ce qui crée une boucle de système de fichiers. Par exemple, ces commandes pourraient créer une boucle avec le lien précédent l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
Un système de fichiers avec une boucle de répertoire a une profondeur infinie:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Éviter une boucle infinie lors de la traversée d'une telle structure de répertoires est un peu difficile (bien que, par exemple, POSIX exige find
d'éviter cela).
Un système de fichiers avec ce type de lien physique n'est plus un arbre, car un arbre ne doit pas, par définition, contenir de boucle.
Ils brisent la clarté des répertoires parents
Avec une boucle de système de fichiers, il existe plusieurs répertoires parents:
cd /tmp/a/b
cd /tmp/a/b/l/b
Dans le premier cas, /tmp/a
est le répertoire parent de /tmp/a/b
.
Dans le second cas, /tmp/a/b/l
est le répertoire parent de /tmp/a/b/l/b
, qui est identique à /tmp/a/b
.
Donc, il a deux répertoires parents.
Ils multiplient les fichiers
Les fichiers sont identifiés par des chemins, après résolution des liens symboliques. Alors
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
sont des fichiers différents.
Il existe une infinité de chemins supplémentaires dans le fichier. Ils sont les mêmes en terme de nombre d'inodes. Mais si vous ne vous attendez pas explicitement à des boucles, il n'y a aucune raison de vérifier cela.
Un répertoire hardlink peut également pointer vers un répertoire enfant ou un répertoire qui n'est ni enfant ni parent d'aucune profondeur. Dans ce cas, un fichier enfant du lien serait répliqué dans deux fichiers, identifiés par deux chemins.
Votre exemple
$ 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
Comment les liens symboliques vers les répertoires peuvent-ils alors fonctionner?
Un chemin qui peut contenir des liens symboliques et même des boucles de répertoires liés logiciels est souvent utilisé uniquement pour identifier et ouvrir un fichier. Il peut être utilisé comme un chemin normal et linéaire.
Mais il existe d'autres situations, lorsque les chemins sont utilisés pour comparer des fichiers. Dans ce cas, les liens symboliques dans le chemin peuvent être résolus en premier, en le convertissant en une représentation minimale et généralement acceptée, créant ainsi un chemin canonique :
Cela est possible car les liens symboliques peuvent tous être étendus à des chemins sans lien. Après avoir fait cela avec tous les liens symboliques d'un chemin, le chemin restant fait partie d'un arbre, où le chemin est toujours sans ambiguïté.
La commande readlink
peut résoudre un chemin d'accès à son chemin canonique:
$ readlink -f /some/symlinked/path
Les liens symboliques sont différents de ceux utilisés par le système de fichiers
Un lien symbolique ne peut pas causer tous les problèmes car il est différent des liens à l'intérieur du système de fichiers. Il peut être distingué des liens matériels et résolu en un chemin sans liens symboliques si nécessaire.
Dans un certain sens, l'ajout de liens symboliques ne modifie pas la structure de base du système de fichiers. Il la conserve, mais ajoute davantage de structure, comme une couche d'application.
De 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
[ ... ]