目录硬链接以多种方式破坏文件系统
它们允许您创建循环
到目录的硬链接可以链接到其自身的父级,从而创建文件系统循环。例如,这些命令可以使用反向链接创建循环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
那么如何软链接到目录?
可能包含软链接甚至软链接目录循环的路径通常仅用于标识和打开文件。可以用作常规的线性路径。
但是,当使用路径比较文件时,还有其他情况。在这种情况下,可以首先解析路径中的符号链接,将其转换为minimum,并通常同意表示以创建规范路径:
这是可能的,因为所有软链接都可以扩展到没有链接的路径。在使用路径中的所有软链接执行此操作之后,其余路径是树的一部分,其中路径始终是唯一的。
该命令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
[ ... ]