##软连接: 也叫符号连接,实际上就是windows之中的快捷方式,软链接是一个文件,这个文件保存这目标文件完整路径。因此建立软链接的时候目标文件必定输入完整路径。不然你将软链接文件移动到别的地方就很差用了。 建立软链接命令:node
<!-- lang: shell --> ln -s /home/myhome/vim/vimrc /home/myhome/.vimrc #-s选项表示建立符号链接
此外你彻底能够建立一个目标文件不存在的软链接,以做为特殊用途。shell
##硬连接: 相对于软链接,硬连接要复杂的多。在了解硬连接前,首先须要知道inode的概念。编程
inode 是 UNIX 操做系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中建立文件系统时,同时将会建立大量的 inode 。一般,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。vim
咱们都知道,磁盘是将文件分割成许多块,放到由扇区(sector,512字节)组成的块(block,通常为4mb)之中。而为了快速查找文件,必须有索引来指示那个文件的第一块的位置。这就是inode的做用之一。 在Linux当中,最多见的就是EXT系列文件系统,它们的inode组成大体以下:windows
其次是目录项。Linux中全部的目录都被视为文件,内容是他所包含的文件的文件名和对应inode。特别的,对于根目录,每个分区都包含一个磁道组信息。根分区也不例外,根分区的 Cylinder Group Blocks里面也包含了根分区的inodes数据,其中包含了根的inode编号。 Linux查找一个文件,例如/home/wgj/ak47.txt,假设咱们未对/home独立分区。 那么系统首先读取分区的头部分,得到根目录的inode值,而后获得根目录文件的内容,查找wgj目录,获取其inode值,递归下去,直到找到ak47.txt的inode值为止。数据结构
了解了这个过程,硬连接就不难理解了:实际上全部的你见到的文件都是硬连接。添加一个硬连接实际上就是在目录文件中添加一个文件名和inode值的key-value对。操作系统
这样就能够理解硬连接的一些特性了,例如不占用inode值(只是对目录文件的修改),没法跨分区建立硬连接(分区不一样,inode值多是同样的),删除源文件,不影响硬连接。(inode值未丢失。还有至少一个)code
学过JAVA编程的能够这么理解,硬连接就至关于变量的引用,一个对象能够有多个引用。若是没有引用指向这个对象,那就能够回收了。因此对于垃圾文件或者非重要文件不要创建硬连接,要否则你删除的时候还要找它全部的硬连接Orz。对象
建立硬连接(无需完整路径):递归
<!-- lang: shell --> ln ak47.txt ak48.txt
##软连接和硬连接的场景
##关于硬连接目录和软连接目录 根据ln的man page,Linux使能够创建目录的硬连接的,可是须要root权限。这么作的缘由是为了防止环的存在。例若有一个目录A,如今创建一个目录A的硬连接,添加到A当中,做为A的子文件夹,那么递归搜索的时候,就会造成一个环,进入死循环。若是要防止这种状况发生,那么就必须将访问过的目录储存在内存中,而后每访问一个文件都检查一下是否已经访问过了。这个过程对于系统来讲,不管是时间复杂度和空间复杂度都是没法接受的。因此原则上并不建议为目录创建硬连接,虽然这对于系统来讲并非很麻烦。
可是软连接却不存在上述问题。对于系统来讲,软链接数目相对较少,并且识别一个文件是软连接的成本很低,所能以较小的代价在内存中创建一个软连接的树或者散列。因此当存在软链接目录环的时候就能够十分方便的判断。