前言:
都坐好哦,我们今天来讲讲软硬链接:

我们上一次呢,讲的是文件系统,详见这篇文章:

其中我们并没有讲软硬连接,所以我们在这里补上~~~
在讲完软硬连接这个小demo之后呢,我们明天就要来正式讲讲库啦:
我们今天的内容不多,所以篇幅不会太长,我们直接开始啦~
正文:
硬链接:
硬链接语法:
ln 源文件 目标硬链接名
硬链接后的现象:
我们先来个示例:
[tsx@VM-0-10-centos 916]$ touch ceshi
[tsx@VM-0-10-centos 916]$ ln ceshi hard_link
[tsx@VM-0-10-centos 916]$ tree
.
|-- ceshi
`-- hard_link
0 directories, 2 files
[tsx@VM-0-10-centos 916]$ ls -li
total 0
920939 -rw-rw-r-- 2 tsx tsx 0 Sep 16 15:28 ceshi
920939 -rw-rw-r-- 2 tsx tsx 0 Sep 16 15:28 hard_link
我们在给ceshi创建硬链接之后,我们就会发现,
这个数字变成2了!!!!
这个数字是什么呢?
我们当年说过,这个数字代表的是硬链接数(那硬链接数是啥?)
硬链接数:代表有多少个 dentry(目录项)指向这个 inode。创建 1 个硬链接,数字就 + 1

同时我们知道,第一列代表的是inode,也就是说......这俩货inode是同一个咯?
我们在一节中知道了,我们要找一个文件,归根结底找的就是inode,然后数据储存在数据块之中,而inode中存在指向数据块的数组,所以inode一样,指向的文件,也就一样!!!!
那这个是不是就,类似于我们c++中的取别名啊!
920939 -rw-rw-r-- 2 tsx tsx 0 Sep 16 15:28 ceshi
920939 -rw-rw-r-- 2 tsx tsx 0 Sep 16 15:28 hard_link
[tsx@VM-0-10-centos 916]$ vim ceshi
[tsx@VM-0-10-centos 916]$ rm ceshi
[tsx@VM-0-10-centos 916]$ cat hard_link
jin tian shi 9 yue 16 r
这里呢,我们在ceshi中写入如下数据:

然后我们将ceshi删掉,我们再读取hard------link之中的数据,我们发现和被删掉的ceshi中的数据相同,这是不是就相当于一个备份的作用?
同时通过这个例子,我们也就知道了,当硬链接数>=2的时候,我们删除一个文件,只是删除了其一个硬链接(相当于别名)而已,并不会真正的删除该文件,当硬链接数为1时,我们删除文件,就是真的把该文件删除了
作用:
①:文件多入口:可以多文件名访问同一个文件
②:给文件做备份,防止文件被误删
局限性:
①:因为inode在一个分区内有效,不可跨分区,所以硬链接也不可以跨分区
②:目录是树形结构,而如果我硬链接之后,可能会形成目录环,破坏目录的树状结构,故:硬链接不可以对目录创建
软链接:
软链接语法:
ln -s 源文件/源目录 目标软链接名
软链接后的现象:
[tsx@VM-0-10-centos 916]$ tree
.
0 directories, 0 files
[tsx@VM-0-10-centos 916]$ touch ceshi
[tsx@VM-0-10-centos 916]$ ln -s ceshi soft_link
[tsx@VM-0-10-centos 916]$ tree
.
|-- ceshi
`-- soft_link -> ceshi
0 directories, 2 files
[tsx@VM-0-10-centos 916]$ ls -li
total 0
920937 -rw-rw-r-- 1 tsx tsx 0 Sep 16 16:05 ceshi
920939 lrwxrwxrwx 1 tsx tsx 5 Sep 16 16:05 soft_link -> ceshi
显然,不同于硬链接的是,这两个文件的inode显然是不同的
我们此时往ceshi中写入:

我们打开soft_link,我们看到的是:

我们发现,通过soft_link,我们也可以看到测试中的数据哎~那么soft_link里存的就是和ceshi一样的数据吗?当然不是!!!!!!
软链接会新建独立 inode,文件里存放的是源文件的路径字符串,相当于 Windows 的快捷方式。
而在我用vim编译器打开的时候:
vim 默认会自动跟随软链接,打开的是源文件,不是软链接本身!
所以就有如上现象;
那么有了软链接,我就可以把藏得很深的文件的软链接拿到前面,这样好找呀!说干就干:
.
|-- 811
| |-- get
| |-- get.c
| |-- haha
| |-- haha.c
| `-- makefile
|-- 916
| |-- ceshi
| `-- soft_link -> ceshi
|-- 99
| |-- haha
| |-- haha.c
| |-- makefile
| |-- xinwenjian
| |-- xixi.c
| `-- \344\273\212\345\244\251\345\220\203\344\273\200\344\271\210
|-- code
|-- code.c
|-- haha
|-- haha.c
|-- install.sh
`-- makefile
3 directories, 19 files
[tsx@VM-0-10-centos ~]$ mv 916/soft_link ./
[tsx@VM-0-10-centos ~]$ tree
.
|-- 811
| |-- get
| |-- get.c
| |-- haha
| |-- haha.c
| `-- makefile
|-- 916
| `-- ceshi
|-- 99
| |-- haha
| |-- haha.c
| |-- makefile
| |-- xinwenjian
| |-- xixi.c
| `-- \344\273\212\345\244\251\345\220\203\344\273\200\344\271\210
|-- code
|-- code.c
|-- haha
|-- haha.c
|-- install.sh
|-- makefile
`-- soft_link -> ceshi
3 directories, 19 files
[tsx@VM-0-10-centos ~]$ vim soft_link
好,那我打开之后:

哇!!!!居然是黑的!!
这显然和我们的预期不符合吧?我的测试文件里面可是写了数据的,那我怎么拿出来,就什么都没了?
我们移回去看看?
[tsx@VM-0-10-centos ~]$ mv soft_link 916
[tsx@VM-0-10-centos ~]$ cd 916
[tsx@VM-0-10-centos 916]$ tree
.
|-- ceshi
`-- soft_link -> ceshi
0 directories, 2 files
[tsx@VM-0-10-centos 916]$ vim soft_link
我们打开以后:

哎?好神奇,找到了哎!
那我们的问题是什么呢:

我们刚才写的嘛:
soft_link文件里面放的是源文件的路径字符串,那我们路径又分为绝对路径和相对路径,我们在创建软链接的时候,只写了:
ln -s ceshi soft_link
所以呀,我们的soft_link里面,放的也就只是一个简单的ceshi,我们如果在一个目录下,操作系统给我前面补上cwd,那我能找到;那如果不在一个目录下,我怎么找?
所以这个问题我们如何解决呢.......
没错!我们可以使用绝对路径!!!!
我们先把上一个soft_link删掉,下面代码已删
[tsx@VM-0-10-centos 916]$ ln -s /home/tsx/916/ceshi soft_link
[tsx@VM-0-10-centos 916]$ tree
.
|-- ceshi
`-- soft_link -> /home/tsx/916/ceshi
0 directories, 2 files
[tsx@VM-0-10-centos 916]$ mv soft_link ..
[tsx@VM-0-10-centos 916]$ tree
.
`-- ceshi
0 directories, 1 file
[tsx@VM-0-10-centos 916]$ cd ..
[tsx@VM-0-10-centos ~]$ vim soft_link
打开以后:

显然这样,我们就实现了目的;
同时:
不仅第一个参数有说法,第二个参数,它也有说法!!!
[tsx@VM-0-10-centos ~]$ cd 916
[tsx@VM-0-10-centos 916]$ tree
.
`-- ceshi
0 directories, 1 file
[tsx@VM-0-10-centos 916]$ pwd
/home/tsx/916
[tsx@VM-0-10-centos 916]$ ln -s /home/tsx/916/ceshi /home/tsx/s_link
[tsx@VM-0-10-centos 916]$ tree
.
`-- ceshi
0 directories, 1 file
[tsx@VM-0-10-centos 916]$ cd ..
[tsx@VM-0-10-centos ~]$ tree
.
|-- 811
| |-- get
| |-- get.c
| |-- haha
| |-- haha.c
| `-- makefile
|-- 916
| `-- ceshi
|-- 99
| |-- haha
| |-- haha.c
| |-- makefile
| |-- xinwenjian
| |-- xixi.c
| `-- \344\273\212\345\244\251\345\220\203\344\273\200\344\271\210
|-- ceshi
|-- code
|-- code.c
|-- haha
|-- haha.c
|-- install.sh
|-- makefile
`-- s_link -> /home/tsx/916/ceshi
3 directories, 20 files
[tsx@VM-0-10-centos ~]$ vim s_link
这时我们发现,如果给第二个参数带上路径,那么它就会在指定目录下生成s_link

软链接的作用:
①:给文件/目录起别名:
可以通过给长路径,深层的目录或者文件起一个简单的名字,方便访问
②:跨分区创建:
虽然硬链接不可以跨分区(文件系统),但是软链接并不受这个限制
③:给目录创建软链接:
软链接可以给目录创建,并且很常用
格外注意:
①:非常建议在创建软连接的时候,给第一个参数带上绝对路径,方便我们找到
②:软链接的文件大小=源路径名字符串的大小,不等于源文件的大小
③:源文件删除,软链接会变成红色闪烁断链,打开是空的,如下:

表格汇总:
这里有一头表格,总结一下上文内容:
| 对比项 | 硬链接(Hard Link) | 软链接(Symbolic Link / 符号链接) |
|---|---|---|
| 创建命令 | ln 源文件 目标 |
ln -s 源文件/目录 目标 |
| inode | 共用同一个 inode,inode 编号相同 | 独立全新 inode,inode 编号和源文件不一样 |
| 本质 | 给同一个 inode,新增一条目录项 dentry(文件的另一个名字) | 独立的小文件,里面存放源文件的路径字符串,类似 Windows 快捷方式 |
| 支持目录 | 不能对目录创建硬链接(防止目录环路) | 可以链接文件,也可以链接目录 |
| 跨文件系统(跨分区) | 不支持,inode 仅在单个分区内唯一 | 支持,可以跨分区创建 |
| 文件大小 | 和源文件大小完全一致 | 大小 = 内部存储的路径字符串的字符长度,和原文件无关 |
| 删除源文件 | 仅仅删除一条目录项,只要链接计数 > 0,数据还在,其余硬链接正常访问 | 源文件删除后,软链接变成断链(悬挂链接),无法访问,终端标红 |
| 移动链接文件 | 移动硬链接,不受位置影响,永远正常 | 相对路径创建 :移动软链接容易断链;绝对路径创建:移动后依旧可用 |
| ls -li 查看 | inode 号一致,链接计数数字增加 | inode 号不同,会用->箭头标出指向路径 |
尾:
其实这是我原来的打算......

我本来打算快速讲完软硬连接,然后进入库的......没想到写的似乎有点多,给我干困了......
哎,一到下午就没什么精神,为了写的更好些,我决定等我更有精神了再写......
我看看:明天上午有一节马克思主义原理,还有一节离散数学,哈哈
明天七点起来继续写!
