软硬连接
在linux下面链接文件有两种,一种是类似window的快捷方式功能的文件,可以让你快速链接到目标文件(或目录),叫做软链接,另一种则是通过文件系统的inode链接来产生新的文件名,而不是产生新的文件,这种叫做硬链接。这是完全不一样的东西。
1.软链接(symbolic link也叫符号链接)
软链接是一个独立的链接文件,有自己的inode,也有自己的inode属性和内容,内部放的是自己所指向的文件的路径,当被链接的原文件出现问题后,该链接则不能使用。
创建命令
ln -s 目标文件 新的链接文件名(自定义的)
示例:
与文件建立软链接
与目录建立软链接
软链接可运用的地方:将一个路径很深的程序,或者库,或者对应的头文件,建立到当前目录下,或者是很好找的路径下,让我们快速去访问到这个文件。
2.硬链接(hard link)
硬链接和目标文件共用一个inode,不会创建新文件,当我们添加一个硬链接时,只更改了当前目录的内容:在目录中增加了新的文件名,添加了原文件的inode和文件名的映射关系。而这个映射关系有一个计数,每多一个硬链接,这个链接数就会+1,这是创建的时候,当我们要删除文件的时候也是,只有等这个连接数为0时,这个文件才算真正意义上的被删除。在没完全删除之前我们都可以通过该文件的其他硬链接来进行访问。(我们其实可以将硬链接当做一个浅拷贝的过程,也就是多增加一个指针指向同一个文件)
红圈出来的数代表硬链接数
创建命令
ln 目标文件 新的链接文件名(自定义的)
与文件建立硬链接
无法与目录建立硬链接
3.解除软硬链接
unlink 软链接名/硬链接名
为什么新建的文件夹硬链接数是2呢?
因为文件夹名和inode构成一组映射关系,而文件夹里面的隐藏文件 . 其实是文件夹的硬链接
4.不能给目录建立硬链接
但是我们上面也说了目录中的一个点(.)代表的其实是文件夹的硬链接,代表当前路径,这又是怎么回事呢?
原来操作系统只允许自己给目录建立硬链接,不允许用户创建,是为了避免环路问题。
举个栗子(假设真的能给目录建立硬链接)
我们都知道目录文件(文件夹)实际上是一种多叉树结构,在目录中找到其他的文件夹名即可用cd 文件夹名进行访问(图中红箭头),也可以cd .. 返回到上级目录(图中蓝箭头),现在我们在d3目录下建立一个d2的硬链接,再创建一个test.c文件,现在要用find命令从d1目录下开始递归式查找test.c文件,但是当我们进入d3的时候遇到hard-link时,又会回到d2里重新找,这样循环往复就出不来了。
再举一个详细的栗子
如果使用hard link链接到目录时,链接的数据需要连同被连接目录下面的所有数据都建立链接,就是说如果你要将/etc使用硬链接来创建一个/etc_hd目录时,那么在/etc_hd目录下面的所有文件名同时都与/etc下面的文件名要创建硬链接,没那么简单,并且,未来如果在/etc_hd下面创建新文件时,连带的,/etc下面的数据又得要创建一次hard link,过于复杂,所以hard link目前对于目录来说暂时不支持。
但是隐藏文件 . 和 .. 又这么解释呢?
它们不也会构成环路问题,这个其实是操作系统进行维护的,而且链接的路径不深。只需要操作系统进行特殊处理就行,但是如果也允许用户这样搞的话,有可能链接的路径很深,这样比如在执行查找或者路径切换的时候就会出问题。
5.总结:
硬链接
1.不能跨文件系统
2.不允许给目录创建硬链接
3.只有当硬链接数为0时,该文件才会完全删除。
4.创建只是在某个目录下添加文件名,以及inode和文件名的映射关系(链接数+1)
软链接
1.可以跨文件系统
2.允许给文件创建软链接
3.是一个独立的文件,有自己的inode,会占用block
4.链接文件被删除,该链接也没有用了
补充:
stat 文件名
显示文件的三个时间
access 最后访问时间
modify 文件内容最后修改时间
change 属性最后修改时间