关于软链接的那点事儿
背景故事
CFan编程委员会有一位叫做穷猫的桑苏在群里问到:
大D看到这个的一瞬间就想到了软链接。为什么会想到软链接呢?因为大D觉得穷猫桑苏要表达的是这个事情:
一个目录或文件有多个入口但保持单一的物理位置
现在Windows7及以上版本已经可以支持软链接了,那么就可以用软链接帮助文件的管理了。
软链接的来源
我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。
在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。
文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
但是这样的文件在共享上存在一些困难,为解决文件共享,引入了软链接和硬链接的概念。
链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。
在Windows上的实现
在Windows上有一个命令:mklink。Linux上可以用ln命令来搞定。
但是需要指出的是Windows并不能在存在相同文件名文件的文件夹内为创建同名的软链接。
例如,文件夹a内存在文件1.txt,那么,在a文件夹内,就不能创建名为1.txt的软链接。
【真绕口令
1 2 3 4 5 6 7 8 9 10 11 12 |
C:\Users\Derek.S>mklink /? 创建符号链接。 MKLINK [[/D] | [/H] | [/J]] Link Target /D 创建目录符号链接。默认为文件 符号链接。 /H 创建硬链接,而不是符号链接。 /J 创建目录联接。 Link 指定新的符号链接名称。 Target 指定新链接引用的路径 (相对或绝对)。 |
实例
这里我们实际模仿一下穷猫桑苏的实际需求。
实践环境:Win 7 SP1
前提说明:有两个文件夹,分别命名为:解决方案、project。在解决方案目录内有一待创建软链接文件 readme.txt。
目的:实践软链接
在project中建立软链接
在project文件夹中创建readme.txt的软链接:
1 2 3 |
C:\example\Symboliclink\project>mklink readme.txt c:\example\Symboliclink\解决方 案\readme.txt 为 readme.txt <<===>> c:\example\Symboliclink\解决方案\readme.txt 创建的符号链接 |
这时,在project文件夹内就有一个“解决方案”目录下的软链接。
修改project目录下的readme.txt,源文件也会更改。
软链接、硬链接、快捷方式的区别
软链接
- 执行命令 mklink link_name target_name
- 创建链接后的图标和快捷方式很像
- 在系统中不占用空间
- 在文件系统中不是一个单独的文件
- 如果源文件被删除了,链接就没用了
- 移除源文件不会影响符号链接(在操作系统中被定义为被遗弃链接)
- 移除链接文件也不会影响源文件
- 可交叉文件系统
硬链接
- 执行命令 mklink /H link_name target_name
- 在系统中占用的空间与源文件相同,但在系统中引用的是相同的对象(不是拷贝)
- 图标和创建快捷方式的图标不同
- 移除源文件不会影响硬链接
- 移除硬链接不会影响源文件
- 如果源文件被删除,它的内容依然通过硬链接存在
- 硬链接文件的任何更改都会影响到源文件
- 在系统中会占用跟源文件一样大小的空间(既源文件的双倍空间)
快捷方式
- 在选择的源文件上鼠标右键,通过下拉菜单创建
- 快捷方式在系统中跟源文件是完全分离的
- 移除源文件不会移除快捷方式
- 移除快捷方式不会影响到源文件
需要说明的一点是,软链接和快捷方式有根本的实质上的区别。
应用场景无外乎穷猫桑苏说的那个,再有的应用场景就是在Windows下开发PHP程序,而PHP需要在apache下运行,那么就需要把文件放到htdocs里面,或者直接修改htdocs目录下的代码,利用软链接,将htdocs目录链接到代码目录,这样代码更新后,就实现了类似“预览更新”的功能。
推荐个小软件来帮忙实现链接:Link Shell Extension
已有 3 条评论
发表评论
电子邮件地址不会被公开。 必填项已标注。
差点看成软文链接
@dave 不科学
我也有同感 差点看成软文链接