最近在知乎上刷到了这样一个问题:linux下为什么硬链接不能链接目录,但能链接文件呢。感觉挺有意思的,于是写下这篇博客
在linux中,可以创建硬链接或软连接,但硬链接不能链接目录,软链接可以
ln 原始文件名 硬链接文件名
ln -s 原始文件(目录)名 软链接文件(目录)名
当创建一个硬链接时,操作系统会在文件系统中创建一个新的文件名和inode,并将其链接到已经存在的inode。这个新的目录项与原始文件名没有任何区别,它们都指向同一个inode中的数据块。所以当对硬链接文件进行操作时,等同于对原始文件进行操作。硬链接的主要好处之一是可以节省存储空间,因为多个文件名可以共享相同的数据块。而软链接则相当于创建了一个桌面快捷键,它不会创建一个新的inode,删除它对文件或目录本身没有任何影响。
每个目录都至少含有两个目录项(即使是空目录),分别是 . 和 .. ,如图:

.代表这该目录本身,而..代表着上级目录。这样子目录和父目录都有指向对方的硬链接,这俩形成了一个环,可见linux文件系统目录树也不是真的树。
下面来举例为啥硬链接就不能链接到目录。假设有一个目录A,其中包含文件B和C,以及子目录D。现在,如果尝试在目录A中创建一个名为E的硬链接,链接到目录A本身的inode,就会遇到问题。
当创建硬链接E时,操作系统会尝试在文件系统中生成一个新的目录项(文件名)E,并将其链接到目录A的inode。然而,目录A已经包含了文件B、C和子目录D的目录项,同时子目录D也拥有自己的inode。
由于硬链接共享相同的inode,问题在于:硬链接E的inode引用了目录A,但是目录A中的文件B、C和子目录D已经有各自的inode。如果我们让硬链接E指向目录A的inode,它也会指向目录A中已经存在的文件B、C和子目录D的inode。
这将导致文件系统无法正确区分硬链接E和目录A中已有的文件和子目录的inode。这种情况下,文件系统会陷入混乱,无法准确地管理和检索文件和目录的数据。用一句话来讲就是会造成无限递归。