Linux硬链软链之ln命令
介绍
实际背景是这样的,当你需要在别的目录下做一些调研训练任务,你需要用到之前训练的数据(数据很大,比如100G),你可以把数据拷贝一份搬到当前目录,这样会比较耗存储空间,也可以使用一个类似超链接的东西link到之前的数据,这就是今天要分享的ln命令。
ln命令有两个重要的性质:
- 同步性。这意味着修改源文件也会修改link后的文件。
- ln可以创建两种link,硬链和软链。创建方法分别是 ln file file_link 和 ln -s file file_link。
既然通过ln命令我们可以很轻松地创建硬链(hard link)和软链(symbolic link)。那么也要介绍一下硬链和软链的区别,
硬链:
- 硬链可以在同一个文件系统中创建一个文件的副本,意味着它可以通过索引节点来进行的连接,其作用是允许一个文件拥有多个有效路径名,能够达到误删除的作用。
- 不允许给目录创建硬链接。
- 源文件被删除后,硬链文件会变成一个普通文件存在,保存有源文件信息。
软链:
- 软链类似于一种『快捷方式』,是一个特殊文件(存有源文件位置),而不是源文件。
- 软链可以跨文件系统
- 软链可以链接目录
- 源文件被删除后,软链失效,读取不到源文件信息。
小结:
- 软链使用更加广泛和方便,平时工作基本使用的软链。
- 软链缺陷:当源文件从一个目录下移到其他目录中,再访问软链文件,系统就找不到了,而硬链就没有这个缺陷,你想怎么移就怎么移。
实例演示
首先,我们创建一个log文件
$ cat log
2020.1.15 work
然后先创建一个硬链
$ ln log log_hard_link
$ cat log_hard_link
2020.1.15 work
发现硬链 log_hard_link 中也有与源文件log一样的数据,然后我们创建一个软链
$ ln -s log log_symbolic_link
$ cat log_symbolic_link
2020.1.15 work
软链log_symbolic_link也有源文件的内容,我们可以看一下两种link的形式
$ ll
total 8
-rw-rw-r-- 2 work work 17 Jan 15 15:24 log
-rw-rw-r-- 2 work work 17 Jan 15 15:24 log_hard_link
lrwxrwxrwx 1 work work 3 Jan 15 15:29 log_symbolic_link -> log
发现软链有一个很明显的连接记好(箭头,指向源文件),同时当你软链文件的颜色和其他文件是不一样的,下面我们尝试修改一下源文件
$ vi log
$ cat log
2020.1.15 work
2020.1.25 spring festival
然后直接查看一下两个链接文件
$ cat log_hard_link
2020.1.15 work
2020.1.25 spring festival
$ cat log_symbolic_link
2020.1.15 work
2020.1.25 spring festival
同步性检验完毕!然后,我们尝试删除源文件
$ rm log
$ ll
total 4
-rw-rw-r-- 1 work work 45 Jan 15 15:33 log_hard_link
lrwxrwxrwx 1 work work 3 Jan 15 15:29 log_symbolic_link -> log
发现软链的颜色又变化了,暗示已经失效,我们具体查看一下
$ cat log_hard_link
2020.1.15 work
2020.1.25 spring festival
$ cat log_symbolic_link
cat: log_symbolic_link: No such file or directory
发现硬链依然存有数据,软链已经失效。这个时候我们补充一个实验,把log文件复原,然后修改一下log文件内容
$ cat log
2020.1.15 work
2020.1.25 spring festival
test
$ cat log_hard_link
2020.1.15 work
2020.1.25 spring festival
$ cat log_symbolic_link
2020.1.15 work
2020.1.25 spring festival
test
从结果看,软链又复原了,说明它记录的是源文件的位置,只要该位置上能找到源文件就能产生作用,同样的如果你把源文件移动了目录软链也会失效;而硬链即使源文件恢复也已经失效,变成了一个普通文件。
最后,如果要删除一个软连接,主要去掉最后的反斜杠/
ln -s data data_link
rm data_link
# 而不是 rm data_line/
# 否则原始数据都没了