cp和ln创建软\硬链接以及软\硬连接之间的区别

cp 命令

基本用法:

cp source destination

该命令将source复制至一个新文件,叫destination。注意,这种复制,是真实将源文件内容拷贝了一份,存在了物理存储空间。

我们使用命令ls -il来显示文件的长列表,会发现destination与source有不同的索引节点号(索引节点是内核分配给文件系统中每个对象的唯一标识数字)。

[复制代码](javascript:void(0)😉

root@iZ28eyzqmtxZ:~# ls
jdk  log.txt
root@iZ28eyzqmtxZ:~# cp log.txt log2.txt
root@iZ28eyzqmtxZ:~# ls -il
total 4
786442 drwxr-xr-x 2 root root 4096 Jun  6 22:33 jdk
787736 -rw-r--r-- 1 root root    0 Jul  2 11:36 log2.txt
787737 -rw-r--r-- 1 root root    0 Jun 14 17:29 log.txt
root@iZ28eyzqmtxZ:~# 

[复制代码](javascript:void(0)😉

cp命令有很多参数,可以进行诸如递归复制整个目录中的所有内容等。相关参数可以参看Linux编程大全。


这里要解释的是-l和-s两个参数。

-l:创建文件链接(硬链接)而非复制文件

-s:创建一个符号链接(软链接)而非复制文件

虽然没有看过Linux的源码,但是可以推断出这边用到了c中的两个特性:指针,指针的指针。

我们知道操作系统在进行存储管理的时候,会为文件存储的物理空间的起点标识一个确定的“地址”,而我们所见的文件名,其实在存储空间中,存储的是真实源文件的“地址”,这个地址指向了源文件的真实存储空间。

img

如上图,存储空间A和存储空间B可能是相邻的存储空间,也可能不是,但它们一定是两个存储空间存了相同的内容。

再看硬链接的图:

img

**也就是说我们如果执行的是 **

cp -l log.txt log2.txt
实际上并没有创建一份新的源文件,只是对存储空间A新加了一个指向它的指针。

[复制代码](javascript:void(0)😉

root@iZ28eyzqmtxZ:~# ls
jdk  log2.txt  log.txt

root@iZ28eyzqmtxZ:~# ls -il
total 4
786442 drwxr-xr-x 2 root root 4096 Jun  6 22:33 jdk
787736 -rw-r--r-- 1 root root    0 Jul  2 11:36 log2.txt
787737 -rw-r--r-- 1 root root    0 Jun 14 17:29 log.txt

root@iZ28eyzqmtxZ:~# cp -l log.txt log3.txt

root@iZ28eyzqmtxZ:~# ls -il
total 4
786442 drwxr-xr-x 2 root root 4096 Jun  6 22:33 jdk
787736 -rw-r--r-- 1 root root    0 Jul  2 11:36 log2.txt
787737 -rw-r--r-- 2 root root    0 Jun 14 17:29 log3.txt
787737 -rw-r--r-- 2 root root    0 Jun 14 17:29 log.txt


[复制代码](javascript:void(0)😉

可见,log.txtlog3.txt公用同一个索引节点号:787737,而且它们俩的****硬链接总数**都变成了2。即存储空间A有两个指向它的****指针******。

这样一来,无论我们是查找log.txt还是log3.txt,都会先找到它们代表的0xA300的存储空间,接着便能找到并操作源文件。

我们在这边可以先解释一个已经可以解释的问题:既然log.txt和log3.txt指向同一个源文件,为什么删除log3.txt之后,仍然可以访问log.txt?

**在Linux编程大全讲解硬链接的内容中有这样一句话:**硬链接会一直维持源文件对应的索引节点号来保留数据,直到你删除了最后一个硬链接它的文件。

也就是说,对于存储空间A来说,你删除了log3.txt之后,只是断掉了一个指向它的****指针****而已,并没有执行删除源文件的操作。

自此,我们讲完了硬链接,其实就是一个指针的概念,硬链接的指针,是指向真实文件的指针,而接下来要讲的软链接,也是一个指针,只不过这个指针指向的是一个地址,该地址也是一个指针,指向真实文件。所以软链接(符号链接),即指针的指针。


上面我们举例说到log.txt代表的是0xA300,这个“0xA300”也需要存在存储空间中,也就是说它也具有一个地址,我们假设为0xA000。那么执行软链接操作:

cp -s log.txt log4.txt

之后真实的存储情况长这样。

img

访问log4.txt时先找到了它代表的0xA000,找到了0xA000**存储空间中存储的内容:0xA300,**发现它丫的还是一个指针,接着找,找到了存储真实文件的存储空间A。

这里我们可以解释另一个现象,就是为什么删除了log.txt之后,无法访问log4.txt?

这个你自己想吧,中间断掉了,它访问0xA000,嗯,发现里面啥都没有!接着就会告诉你它已经不复存在了,然而你使用ls命令的时候,仍然能看到log4.txt这个文件名,只是无法查看它的内容了。


忠告:

不要觉得软链接和硬链接如此牛逼,就一顿乱用,人家是有使用场合的,
  • 硬链接,是你在同种媒体介质上不想为相同的内容耗费两份存储空间的时候使用的
  • 软链接是你想在不同挂载点上使用该文件的时候使用的(即不能在不同挂载点下的文件间创建硬链接)。

如果你一个劲的使用软链接,就会各种断,各种崩。


ln命令

ln命令可以代替cp命令,默认情况下,ln命令会创建硬链接,要加上参数 -s以创建软链接。
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

Pert-

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值