Hardlinks de diretório quebram o sistema de arquivos de várias maneiras
Eles permitem que você crie loops
Um link físico para um diretório pode ser vinculado a um pai de si mesmo, o que cria um loop do sistema de arquivos. Por exemplo, esses comandos podem criar um loop com o link de retorno l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
Um sistema de arquivos com um loop de diretório tem profundidade infinita:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Qualquer comando find
sem o predicado -maxdepth
será executado em um loop infinito. Isso significa que você não pode mais usar find
, que é um comando importante, de maneira consistente. Semelhante para o comando locate
igualmente importante.
Uma árvore, por definição, não tem loops, então o sistema de arquivos não é mais uma árvore.
Eles quebram a falta de ambigüidade dos diretórios pais
Com um loop de sistema de arquivos, existem vários diretórios pai:
cd /tmp/a/b
cd /tmp/a/b/l/b
No primeiro caso, /tmp/a
é o diretório pai de /tmp/a/b
.
No segundo caso, /tmp/a/b/l
é o diretório pai de /tmp/a/b/l/b
, que é o mesmo que /tmp/a/b
.
Então tem dois diretórios pai.
Eles multiplicam arquivos
Os arquivos são identificados por caminhos, após a resolução de links simbólicos. Então
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
são arquivos diferentes.
Existem infinitamente muitos outros caminhos do arquivo. Eles são os mesmos em termos de seu número de inode, é claro. Mas se você não espera explicitamente loops, não há razão para verificar isso.
Um hardlink de diretório também pode apontar para um diretório filho ou um diretório que não seja filho nem pai de qualquer profundidade. Nesse caso, um arquivo que é filho do link seria replicado em dois arquivos, identificados por dois caminhos.
Seu exemplo
$ 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
Como links virtuais para diretórios podem funcionar?
Um caminho que pode conter softlinks e até mesmo loops de diretório vinculados é usado apenas para identificar e abrir um arquivo. Pode ser usado como um caminho normal e linear.
Mas há outras situações, quando os caminhos são usados para comparar arquivos. Nesse caso, os links simbólicos no caminho podem ser resolvidos primeiro, convertendo-os em uma mínima e uma representação comumente acordada criando um caminho canônico :
Isso é possível, porque os soft links podem ser expandidos para caminhos sem o link. Depois de fazer isso com todos os links flexíveis em um caminho, o caminho restante é parte de uma árvore, onde um caminho é sempre inequívoco.
O comando readlink
pode resolver um caminho para seu caminho canônico:
$ readlink -f /some/symlinked/path
Links suaves são diferentes do que o sistema de arquivos usa
Um link não pode causar todos os problemas porque é diferente dos links dentro do sistema de arquivos. Ele pode ser distinguido de links físicos e resolvido para um caminho sem links simbólicos, se necessário.
De certa forma, adicionar links simbólicos não altera a estrutura básica do sistema de arquivos - ele mantém, mas adiciona mais estrutura como uma camada de aplicação.
Em 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
[ ... ]