现代操作系统中文系统中的各种链接@符号链接@软链接@硬链接@链接点
文章目录
现代操作系统中文件系统中的各种链接和符号
参考文档
Microsoft Windows相关文档👺
- 由于windows和linux/unix系系统的区别,某些概念可能有解释和理解上的差别
- 特别是windows上符号链接和软连接以及Junction链接的概念,其中符号链接旨在帮助迁移和应用程序与 UNIX 操作系统兼容。 Microsoft 已实现其符号链接,使其功能与 UNIX 链接一样.𪻐windows vista开始支持symbolicLink
您可以阅读相关文档了解信息(节选则windows应用开发文档)
文件系统
创建链接
Create Symbolic Link in Windows with PowerShell (winaero.com)
三类链接对比
符号链接(Symbolic Link)、硬链接(Hard Link)、连接点(Junction)的详细对比
符号链接、硬链接和连接点是文件系统中的三种不同链接类型,它们各有特点和用途。下面详细对比这三种链接类型。
1. 符号链接(Symbolic Link)
-
定义:符号链接是一个特殊类型的文件,它包含指向另一个文件或目录的路径。符号链接可以指向文件或目录,也可以跨越文件系统边界。
-
命令:
- Linux:
ln -s target_link_name symbolic_link_name
- Windows:
mklink symbolic_link_name target_link_name
- Linux:
-
特点:
- 独立性:符号链接独立于目标文件或目录存在,删除符号链接不会影响目标文件。
- 跨文件系统:符号链接可以指向不同文件系统上的目标。
- 文件类型:符号链接在文件系统中是一个独立的文件,具有不同的 inode(在 Linux 上)。
- 路径解析:操作系统在访问符号链接时会解析路径并重定向到目标文件。
-
示例:
- Linux:
ln -s /home/user/target.txt /home/user/symlink.txt
- Windows:
mklink C:\Users\User\symlink.txt C:\Users\User\target.txt
- Linux:
2. 硬链接(Hard Link)
-
定义:硬链接是多个文件名指向同一个文件内容。硬链接共享相同的 inode,指向相同的数据块。
-
命令:
- Linux:
ln target_link_name hard_link_name
- Windows:
mklink /H hard_link_name target_link_name
- Linux:
-
特点:
-
同一文件系统:硬链接必须在同一文件系统内。
-
共享内容:所有硬链接共享相同的文件内容,修改一个硬链接的内容会影响所有指向同一内容的链接。
-
不可链目录:通常硬链接不能用于目录(除非使用一些特殊的系统工具)。
-
引用计数:文件的引用计数增加,直到所有硬链接都被删除,文件数据才会被删除。
-
同分区内可以创建文件的hardlink,而在windows中hardlink类型的Target无法被标识,
显然,当磁盘上的某个文件没有任何hardlink,则对于计算机(用户)而言,这个文件就找不到了效果如同删除掉
从前面的介绍和总结也可以看出hardlink的删除效果,是当一个文件的所有hardlink被删除后,文件也就被删除了,否则仍然能够找到文件并使用它
在合适的场景下创建hardlink是很有用的,由于一个文件创建多个hardlink几乎不会增加磁盘占用,多个hardlink知识有多个只想文件实体的指针(路标),文件本身不会保存多份(因此实际上通常我们在计算机上删除一个文件只是删除掉文件的hardlink;这就为找回被误删的文件留有余地;所以相应的有不可恢复删除这一狠招,不仅仅删除掉文件实体的hardlink,还将实体的数据块写入其他的数据导致即使找回hardlink也找不回来原来的文件数据
因此发现误删行为后,应尽量避免继续读写磁盘(断电,请专业人士帮忙等),能够降低数据再也找不回来的几率(保留更高的追回数据的希望)
在不同目录中存放了某个文件(不妨称为文件X)的不同的hardlink,只是存放了相互独立地位相同的文件X的指针(定位方式),如果某个目录中hardlink被删除,只要其他目录还存在别的hardlink,就仍然能够访问到文件X
hardlink的这种特性为维护被共用的配置文件提供了方便,通过任意一个hardlink访问到文件X并做了修改,那么其他hardlink访问的也是修改后的结果
然而强大的hardlink机制却不支持跨分区创建文件的hardlink;退一步的做法有
-
创建symbol link,虽然在windows上默认需要管理员权限,但是可以修改策略组来取消,而且不仅支持跨分区,也同时支持文件和目录创建symbolic link
-
创建目标文件所在目录的junction link代替需要创建在新位置的目录
-
当然我们知道如果删除掉symbolic link的目标文件/目录,那么symbolic link就会失去目标,造成链接不可用
-
-
-
示例:
- Linux:
ln /home/user/target.txt /home/user/hardlink.txt
- Windows:
mklink /H C:\Users\User\hardlink.txt C:\Users\User\target.txt
- Linux:
3. 连接点(Junction)
-
定义:连接点是 Windows 文件系统中的一种特殊符号链接,主要用于目录链接。连接点类似于符号链接,但主要用来创建目录链接。
-
命令:
- Windows:
mklink /J junction_name target_directory
- Windows:
-
特点:
- 目录链接:连接点只能用于目录,不能用于文件。
- 相对路径:连接点通常使用绝对路径,不支持网络路径。
- 本地文件系统:连接点只能在本地文件系统内创建,不能跨文件系统。
- 透明性:在访问连接点时,操作系统会透明地重定向到目标目录,用户和应用程序不感知中间过程。
-
示例:
- Windows:
mklink /J C:\Users\User\junction C:\Users\User\target_folder
- Windows:
对比总结
特点 | 符号链接(Symbolic Link) | 硬链接(Hard Link) | 连接点(Junction) |
---|---|---|---|
定义 | 指向另一个文件或目录的路径 | 多个文件名指向相同的文件内容 | 用于目录的特殊符号链接 |
命令 | ln -s (Linux),mklink (Windows) | ln (Linux),mklink /H (Windows) | mklink /J (Windows) |
目标类型 | 文件或目录 | 文件 | 目录 |
跨文件系统 | 是 | 否 | 是 |
引用计数 | 否 | 是 | 否 |
独立性 | 是 | 否 | 是 |
删除效果 | 删除链接不影响目标文件 | 需删除所有硬链接才能删除目标文件 | 删除链接不影响目标目录 |
路径解析 | 需要解析路径,访问符号链接时重定向到目标文件 | 不需要路径解析,直接指向相同的文件内容 | 需要解析路径,访问连接点时重定向到目标目录 |
系统支持 | Linux 和 Windows | Linux 和 Windows(NTFS 文件系统) | Windows(NTFS 文件系统) |
目录支持 | 支持(Linux 和 Windows) | 不支持(通常情况下) | 支持 |
跨文件系统
-
windows SymbolicLink 和Junction对不同文件系统的支持:symbolicLink和junction都支持创建链接到非NTFS分区的文件系统上,比如FAT32(但是FAT32不支持SymbolicLink(junction),即无法在Fat32上创建SymbolicLink(junction))
-
其中分区U是一个FAT32分区(以Junction为例)
PS🌙[BAT:71%][MEM:44.88% (14.23/31.71)GB][19:39:52] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> new-item -ItemType Junction -path TestJunction -Target U:\DirInFat32 Directory: C:\Users\cxxu\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- l---- 2024/5/28 19:40 TestJunction U:\DirInFat32
使用场景示例
-
符号链接:适用于需要跨越文件系统创建链接,或者需要为文件和目录创建快捷方式的场景。例如,将一个常用的配置文件链接到多个项目中。
- Linux:
ln -s /var/www/project/config /home/user/config_link
- Windows:
mklink C:\Users\User\config_link C:\Users\User\project\config
- Linux:
-
硬链接:适用于在同一文件系统中需要多个文件名指向相同数据的场景。例如,为重要数据创建备份,而不增加存储空间。
- Linux:
ln /home/user/important_data /home/user/backup_data
- Windows:
mklink /H C:\Users\User\backup_data C:\Users\User\important_data
- Linux:
-
连接点:适用于需要为目录创建链接的场景,例如将一个项目目录链接到另一个位置,便于访问。
- Windows:
mklink /J C:\Users\User\project_link C:\Users\User\projects\project_directory
- Windows:
通过上述详细对比和示例,可以更好地理解符号链接、硬链接和连接点的特点及其适用场景,从而在实际应用中选择合适的链接类型。
链接的独立性
在文件系统链接中,“独立性”指的是链接与目标文件或目录在存在和删除上的相互依赖关系。
- 独立性:一个具有独立性的链接在删除时不会影响目标文件或目录的存在。也就是说,删除链接只会删除链接本身,而不会删除它所指向的目标文件或目录。
链接被删除后的效果
1. 符号链接(Symbolic Link)
-
独立性:高。符号链接是独立的文件,删除符号链接不会影响目标文件或目录。
-
目标文件(目录)被删除时:
- 符号链接仍然存在,但变成“断开的链接”或“死链接”。
- 访问符号链接会导致错误,通常是“文件不存在”或“没有这样的文件或目录”。
示例:
ln -s /home/user/target.txt /home/user/symlink.txt rm /home/user/target.txt cat /home/user/symlink.txt # 会报错,因为目标文件已删除 Windows:
mklink C:\Users\User\symlink.txt C:\Users\User\target.txt del C:\Users\User\target.txt type C:\Users\User\symlink.txt # 会报错,因为目标文件已删除
2. 硬链接(Hard Link)
-
独立性:低。硬链接和目标文件共享相同的 inode 和数据块。硬链接是文件的多个路径名,所有硬链接都指向相同的数据内容。
-
目标文件被删除时:
- 如果删除一个硬链接,文件内容仍然存在,因为其他硬链接仍然存在。
- 只有当所有指向同一文件的硬链接都被删除时,文件内容才会被删除。
示例:
ln /home/user/target.txt /home/user/hardlink.txt rm /home/user/target.txt cat /home/user/hardlink.txt # 内容仍然存在,因为 hardlink.txt 还在 Windows:
mklink /H C:\Users\User\hardlink.txt C:\Users\User\target.txt del C:\Users\User\target.txt type C:\Users\User\hardlink.txt # 内容仍然存在,因为 hardlink.txt 还在
3. 连接点(Junction)
-
独立性:高。连接点是独立的目录链接,删除连接点不会影响目标目录。
-
目标目录被删除时:
- 连接点仍然存在,但变成“断开的链接”。
- 访问连接点会导致错误,通常是“目录不存在”。
示例:
Windows:mklink /J C:\Users\User\junction C:\Users\User\target_folder rmdir C:\Users\User\target_folder dir C:\Users\User\junction # 会报错,因为目标目录已删除
对比总结
特点 | 符号链接(Symbolic Link) | 硬链接(Hard Link) | 连接点(Junction) |
---|---|---|---|
独立性 | 高。删除符号链接不会影响目标文件或目录 | 低。硬链接和目标文件共享相同的 inode 和数据块 | 高。删除连接点不会影响目标目录 |
目标文件/目录被删除时 | 链接变为断开的链接,访问会报错 | 只要还有硬链接存在,文件内容仍然存在。所有硬链接删除后,文件内容才会被删除 | 链接变为断开的链接,访问会报错 |
访问效果 | 需要路径解析,访问符号链接时重定向到目标文件或目录 | 不需要路径解析,直接指向相同的文件内容 | 需要路径解析,访问连接点时重定向到目标目录 |
具体使用场景
- 符号链接:适用于需要灵活指向文件或目录的场景,特别是需要跨越文件系统边界时。
- 硬链接:适用于在同一文件系统内需要多个路径名指向相同数据的场景,可以用于节省存储空间。
- 连接点:适用于需要在本地文件系统内创建目录链接的场景,便于目录的访问和管理。
通过这些对比和解释,你可以更清楚地理解符号链接、硬链接和连接点的独立性及其在目标文件或目录被删除时的表现,从而在实际使用中选择合适的链接类型。
FAQ:硬链接不支持目录的原因
硬链接(Hard Link)不支持目录的原因主要是出于文件系统结构和数据一致性管理的考虑。
文件系统结构
-
目录树结构:
- 文件系统的目录结构是一个树状结构,每个目录可以包含文件和子目录。允许对目录使用硬链接会破坏这种树状结构,使得目录结构可能变成图结构,增加了管理复杂性。
- 如果目录可以有多个硬链接,可能会引发循环引用(例如,目录A中包含目录B,而目录B中又包含目录A),这会导致遍历文件系统时出现无限循环的问题。
-
引用计数管理:
- 硬链接使用引用计数来管理文件的生命周期。每当创建一个硬链接,引用计数增加;每当删除一个硬链接,引用计数减少。只有当引用计数为零时,文件数据才会被实际删除。
- 对目录进行硬链接会大大增加引用计数管理的复杂性,因为每个目录中包含的所有文件和子目录的引用计数都可能受到影响。
数据一致性和系统稳定性
-
目录硬链接的风险:
- 硬链接指向相同的数据块,而目录包含文件和其他目录的指针。如果允许对目录创建硬链接,任何对目录内容的修改都需要同步到所有硬链接,这会显著增加数据一致性维护的难度。
- 例如,在一个目录中添加或删除文件,需要更新所有指向该目录的硬链接,确保文件系统的一致性。这种操作会变得非常复杂且容易出错。
-
安全性和权限管理:
- 目录硬链接可能引入权限管理的问题。如果多个硬链接指向同一个目录,权限变更需要在所有硬链接中同步,这会导致权限管理变得复杂和不可控。
- 不同用户可能拥有对同一目录的不同访问权限,对目录的硬链接可能导致权限冲突和安全问题。
实际系统实现
- UNIX/Linux 系统:
- 在传统的 UNIX 和 Linux 文件系统中,硬链接仅限于文件,不允许对目录使用硬链接。这是为了简化文件系统的管理,避免上述结构和一致性问题。
- Windows 系统:
- 在 Windows 的 NTFS 文件系统中,也不允许对目录使用硬链接。
- Windows 提供了目录连接点(Junction)和符号链接(Symbolic Link)来实现类似的功能,但它们是独立的机制,不同于硬链接。
- 目录连接点和符号链接可以解决某些目录链接需求,但不会引入硬链接的复杂性问题。
对比总结
链接类型 | 文件支持 | 目录支持 | 主要用途 |
---|---|---|---|
硬链接 | 是 | 否 | 为文件创建多个路径名,节省存储空间 |
符号链接 | 是 | 是 | 创建跨文件系统的快捷方式,一般默认需要管理员权限 |
目录连接点 | 否 | 是 | 在本地文件系统内创建目录链接,不需要管理员权限 |
示例说明
-
硬链接:在同一文件系统中创建文件的硬链接,多个硬链接指向相同的数据内容。
ln /home/user/file.txt /home/user/hardlink.txt -
符号链接:创建文件或目录的符号链接,可以跨文件系统。
ln -s /home/user/target.txt /home/user/symlink.txt # Linux mklink C:\Users\User\symlink.txt C:\Users\User\target.txt # Windows -
目录连接点:在 Windows 中创建目录连接点,用于创建目录的快捷方式。
mklink /J C:\Users\User\junction C:\Users\User\target_folder
通过这些对比和示例,你可以更清楚地理解为什么硬链接不支持目录,以及在实际应用中如何选择适当的链接类型。
powershell对于文件系统的链接支持👺
windows中,处理mklink
命令,还有现代化的powershell提供的new-item
命令可以创建各种链接
符号链接相关演示
管理员权限下,在C盘创建跨分区到Z盘的文件的符号链接
考虑到Fat32格式的分区在现代计算机上比较少见了,因为Fat32有很大的局限性,这里测试机器有2个分区,分别是C盘和Z盘(本人其实习惯只有一个分区,为了演示,从内存哪里创建了一个内存盘作为Z分区)
PS🌙[BAT:72%][MEM:20.41% (6.47/31.71)GB][22:01:04] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> new-item -ItemType SymbolicLink -Path demo -Target Z:\Dir\演示视频5.mp4 Directory: C:\Users\cxxu\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- la--- 2024/5/27 22:02 0 demo Z:\Dir\演示视频5.mp4
创建跨分区的目录链接也可以
PS> new-item -ItemType SymbolicLink -Path DemoSymbolToDir -Target Z:\Dir Directory: C:\Users\cxxu\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- l---- 2024/5/27 22:02 DemoSymbolToDir Z:\Dir
查看目录下的符号链接
PS> ls |?{$_.LinkType } Directory: C:\Users\cxxu\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- l---- 2024/5/27 22:02 DemoSymbolToDir Z:\Dir la--- 2024/5/27 22:02 0 demo Z:\Dir\演示视频5.mp4
删除符号链接,检查独立性(目标文件不受影响)
PS🌙[BAT:72%][MEM:21.42% (6.79/31.71)GB][22:07:10] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> rm .\demo PS🌙[BAT:72%][MEM:21.24% (6.74/31.71)GB][22:07:23] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> ls |?{$_.LinkType } Directory: C:\Users\cxxu\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- l---- 2024/5/27 22:02 DemoSymbolToDir Z:\Dir PS🌙[BAT:72%][MEM:21.24% (6.74/31.71)GB][22:07:27] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> ls Z:\dir\演示视频5.mp4 Directory: Z:\dir Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2024/5/24 11:30 14226016 演示视频5.mp4
Junction 链接演示
PS🌙[BAT:72%][MEM:21.56% (6.84/31.71)GB][22:09:20] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> new-item -ItemType Junction -Path DemoJunctionToDir -Target Z:\Dir Directory: C:\Users\cxxu\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- l---- 2024/5/27 22:09 DemoJunctionToDir Z:\Dir PS🌙[BAT:72%][MEM:17.96% (5.69/31.71)GB][22:09:48] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> ls Z:\dir\演示视频5.mp4^C PS🌙[BAT:72%][MEM:19.42% (6.16/31.71)GB][22:11:59] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> ls |?{$_.LinkType } Directory: C:\Users\cxxu\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- l---- 2024/5/27 22:09 DemoJunctionToDir Z:\Dir l---- 2024/5/27 22:02 DemoSymbolToDir Z:\Dir PS🌙[BAT:72%][MEM:19.42% (6.16/31.71)GB][22:12:02] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> ls |?{$_.LinkType }|select Name,LinkType,LinkTarget Name LinkType LinkTarget ---- -------- ---------- DemoJunctionToDir Junction Z:\Dir DemoSymbolToDir SymbolicLink Z:\Dir
删除Junction链接后目标目录及其文件都在
PS🌙[BAT:72%][MEM:19.46% (6.17/31.71)GB][22:12:36] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> rm .\DemoJunctionToDir\ PS🌙[BAT:72%][MEM:19.53% (6.19/31.71)GB][22:13:26] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> ls |?{$_.LinkType }|select Name,LinkType,LinkTarget Name LinkType LinkTarget ---- -------- ---------- DemoSymbolToDir SymbolicLink Z:\Dir PS🌙[BAT:72%][MEM:19.53% (6.19/31.71)GB][22:13:28] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> ls Z:\dir\演示视频5.mp4 Directory: Z:\dir Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2024/5/24 11:30 14226016 演示视频5.mp4
junction 不支持对文件创建链接
PS> new-item -ItemType Junction -Path DemoJunctionToFile -Target Z:\Dir\演示视频5.mp4 New-Item: A directory is required for the operation. The item 'Z:\Dir\演示视频5.mp4' is not a directory.
硬链接演示
hardlink不支持跨分区创建文件链接
PS🌙[BAT:72%][MEM:19.54% (6.2/31.71)GB][22:14:42] #⚡️[cxxu@COLORFULCXXU][~\Desktop] PS> new-item -ItemType HardLink -Path DemoHardLinkToFile -Target Z:\Dir\演示视频5.mp4 New-Item: The system cannot move the file to a different disk drive.
快捷方式和符号链接的比较
在 Windows 系统中,传统的快捷方式(Shortcut)和符号链接(Symbolic Link)都是用来创建指向文件或目录的链接,但它们有不同的特点和使用场景。下面是对这两种链接的详细比较。
传统快捷方式(Shortcut)
特点
-
文件类型:
- 快捷方式是一种特殊类型的文件,通常有
.lnk
扩展名,用于指向另一个文件或目录。
- 快捷方式是一种特殊类型的文件,通常有
-
创建方式:
- 可以通过图形用户界面(GUI)右键菜单中的“创建快捷方式”选项来创建。
- 也可以使用 Windows 命令行工具
shortcut.exe
创建。
-
显示:
- 在 Windows 文件资源管理器中,快捷方式文件显示为带有箭头的小图标。
- 可以包含目标文件或目录的信息,如路径、图标、启动参数等。
-
操作:
- 双击快捷方式会打开目标文件或目录。
- 快捷方式本身是一个文件,如果快捷方式被删除,不影响目标文件或目录。
-
路径解析:
- 快捷方式文件存储了目标路径,Windows 在访问快捷方式时解析这个路径来定位目标。
-
跨文件系统:
- 快捷方式可以指向同一文件系统或不同文件系统上的目标文件或目录。
示例
通过 GUI 创建:
- 右键单击一个文件或目录。
- 选择“创建快捷方式”。
- 将生成的快捷方式文件移动到所需位置。
符号链接(Symbolic Link)
特点
-
文件类型:
- 符号链接是文件系统级别的链接,直接指向另一个文件或目录。它们在文件系统中表现为目标文件或目录的别名。
-
创建方式:
- 使用命令行工具
mklink
创建符号链接。 - 创建文件的符号链接:
mklink link_name target_path
- 创建目录的符号链接:
mklink /D link_name target_path
- 使用命令行工具
-
显示:
- 在 Windows 文件资源管理器中,符号链接文件显示为带有小箭头的图标(与快捷方式类似,但没有
.lnk
扩展名)。
- 在 Windows 文件资源管理器中,符号链接文件显示为带有小箭头的图标(与快捷方式类似,但没有
-
操作:
- 访问符号链接就像访问目标文件或目录,几乎没有性能损失。
- 符号链接是文件系统级别的,删除符号链接不影响目标文件或目录。
-
路径解析:
-
符号链接存储了目标路径,操作系统在访问符号链接时会自动重定向到目标路径。
-
在powershell 7.1以及之后的版本中,利用new-item 创建symbolicLink时允许使用相对路径而不实用绝对路径,进一步提高灵活性
-
例如
PS🌙[BAT:72%][MEM:21.19% (6.72/31.71)GB][23:24:19] #⚡️[cxxu@COLORFULCXXU][C:\share\MK\Wedo] PS> new-item -ItemType SymbolicLink -Path .\demoSymbol -Target '..\伪新拟态typora css.md' Directory: C:\share\MK\Wedo Mode LastWriteTime Length Name ---- ------------- ------ ---- la--- 2024/5/27 23:24 0 demoSymbol ..\伪新拟态typora c ss.md PS🌙[BAT:72%][MEM:22.45% (7.12/31.71)GB][23:27:58] #⚡️[cxxu@COLORFULCXXU][C:\share\MKt\Wedo] PS> ls |?{$_.LinkType }|select Name,LinkType,LinkTarget Name LinkType LinkTarget ---- -------- ---------- demoSymbol SymbolicLink ..\伪新拟态typora css.md 例子中demosymbol指向父目录(原来名为MK)中的一个markdown文件,当我把demosymbol所在目录(MK)改为MKt,再访问新路径下原来的符号链接仍然能够正确指向原来的文件而不失效
如果是传统的快捷方式(.lnk)文件,此时就会失效
-
-
跨文件系统:
- 符号链接可以跨文件系统边界指向目标文件或目录。
-
权限要求:
- 创建符号链接通常需要管理员权限,除非修改本地安全策略允许普通用户创建。
示例
通过命令行创建:
mklink C:\path\to\link C:\path\to\target # 创建文件符号链接 mklink /D C:\path\to\link C:\path\to\target # 创建目录符号链接
对比总结
特点 | 传统快捷方式(Shortcut) | 符号链接(Symbolic Link) |
---|---|---|
文件类型 | 特殊文件,扩展名 .lnk | 文件系统级别的链接,直接指向目标文件或目录 |
创建方式 | 通过 GUI 或命令行工具 shortcut.exe | 通过命令行工具 mklink |
显示 | 显示为带有箭头的小图标,扩展名 .lnk | 显示为带有箭头的小图标,无扩展名 |
操作 | 双击打开目标文件或目录 | 直接访问目标文件或目录,无明显性能损失 |
路径解析 | 存储目标路径,Windows 解析路径来定位目标 | 操作系统在访问时自动重定向到目标路径 |
跨文件系统 | 可以跨文件系统 | 可以跨文件系统 |
权限要求 | 不需要管理员权限 | 通常需要管理员权限 |
独立性 | 删除快捷方式不影响目标文件或目录 | 删除符号链接不影响目标文件或目录 |
使用场景 | 常用于桌面、开始菜单等位置创建访问快捷方式 | 用于文件系统内部的灵活链接和目录重组 |
磁盘占用 | 常见大小为1KB,2KB(如果路径长一些,会大点) | 几乎是0KB |
相对路径的支持 | 缺乏支持 | 较新版本中支持 |
重要特点 | 对于路径型快捷方式,主要有explorer(资源管理器来解析);其他软件会认为快捷方式(.lnk)就是个普通文件; 可以作为某些命令行的启动方式,比如创建一个利用vscode 打开指定目录的快捷方式 | 专注于路径; 能够被explorer的软件当做目录来跳转和使用 |
具体使用场景
- 传统快捷方式:适用于需要在桌面、开始菜单或其他方便位置创建快捷访问路径的场景。比如,桌面上创建常用应用程序或文档的快捷方式。
- 符号链接:适用于需要文件系统内部重组,创建灵活链接的场景。比如,在开发环境中,将多个项目中的共享库通过符号链接统一到一个目录。
通过上述比较,可以清晰地看到传统快捷方式和符号链接的不同特点和适用场景,从而根据实际需求选择合适的链接类型。
链接移动和复制效果👺
- 文件X的各类链接移动或删除的效果
对比总结
以下是windows系统下的操作总结(linux/unix下可能有有差异)
特点 | 符号链接(Symbolic Link) | 硬链接(Hard Link) | 连接点(Junction) | 快捷方式(Shortcut) |
---|---|---|---|---|
同一文件系统移动 | 移动目标文件,而符号链接留在原地,重新打开符号链接会是空的 | 仅移动硬链接,不影响文件数据 | 同Symbolic Link | 仅移动快捷方式,不影响目标文件 |
跨文件系统移动 | 移动目标文件,而符号链接留在原地,重新打开符号链接会是空的 | 会创建文件的独立副本,并删除原来的硬链接(例如C盘文件移动到D盘就是如此),注意原来的文件如果有多个硬链接,则原文件不会正真被删除 | 同Symbolic Link | 复制快捷方式到目标文件系统 |
复制操作 | 创建副本(文件数量大/多时明显耗时) | 创建文件的独立副本(大文件明显耗时) | 同Symbolic Link | 创建新的快捷方式,指向相同目标 |
独立性 | 高,删除链接不影响目标文件 | 低,共享相同的数据块 | 高,删除连接点不影响目标目录 | 高,删除快捷方式不影响目标文件 |
权限要求 | 通常需要管理员权限 | 不需要管理员权限 | 不需要管理员权限 | 不需要管理员权限 |
重要特点 | 仿佛在直接操作symbolicLink的目标目录或文件,只是删除symbolicLink时不会影响到其目标对象 | 就是操作目标对象本身,除了删除时,只有文件的所有hardlink删除掉才会真的删除 | 和symbolicLink很像,但是权限比较宽松;仅支持目录创建junctionLink | 如同操作一个小文件 |
linux中的效果
以符号链接为例,实验可以发现,复制符号链接效果相当于直接复制符号链接的目标
(base) #( 05/28/24@10:02AM )( cxxu@ubt22 ):~/demodir ln -s ../gitee_install.sh gi.sh.bak (base) #( 05/28/24@10:03AM )( cxxu@ubt22 ):~/demodir ls -l total 0 lrwxrwxrwx 1 cxxu cxxu 19 May 28 10:03 gi.sh.bak -> ../gitee_install.sh (base) #( 05/28/24@10:03AM )( cxxu@ubt22 ):~/demodir mkdir innerDir (base) #( 05/28/24@10:04AM )( cxxu@ubt22 ):~/demodir cp gi.sh.bak innerDir (base) #( 05/28/24@10:04AM )( cxxu@ubt22 ):~/demodir ls gi.sh.bak innerDir (base) #( 05/28/24@10:04AM )( cxxu@ubt22 ):~/demodir ls -l -R .: total 4 lrwxrwxrwx 1 cxxu cxxu 19 May 28 10:03 gi.sh.bak -> ../gitee_install.sh drwxrwxr-x 2 cxxu cxxu 4096 May 28 10:04 innerDir ./innerDir: total 20 -rw-rw-r-- 1 cxxu cxxu 18464 May 28 10:04 gi.sh.bak
移动符号链接,效果是仅仅移动符号链接,而不是目标本身
(base) #( 05/28/24@10:24AM )( cxxu@ubt22 ):~/demodir mkdir innerDir2 (base) #( 05/28/24@10:24AM )( cxxu@ubt22 ):~/demodir ls -l total 8 lrwxrwxrwx 1 cxxu cxxu 19 May 28 10:03 gi.sh.bak -> ../gitee_install.sh drwxrwxr-x 2 cxxu cxxu 4096 May 28 10:04 innerDir drwxrwxr-x 2 cxxu cxxu 4096 May 28 10:24 innerDir2 (base) #( 05/28/24@10:24AM )( cxxu@ubt22 ):~/demodir mv gi.sh.bak innerDir2 (base) #( 05/28/24@10:24AM )( cxxu@ubt22 ):~/demodir ls -l total 8 drwxrwxr-x 2 cxxu cxxu 4096 May 28 10:04 innerDir drwxrwxr-x 2 cxxu cxxu 4096 May 28 10:24 innerDir2 (base) #( 05/28/24@10:24AM )( cxxu@ubt22 ):~/demodir cd innerDir2 (base) #( 05/28/24@10:24AM )( cxxu@ubt22 ):~/demodir/innerDir2 ls gi.sh.bak (base) #( 05/28/24@10:24AM )( cxxu@ubt22 ):~/demodir/innerDir2 ls -l total 0 lrwxrwxrwx 1 cxxu cxxu 19 May 28 10:03 gi.sh.bak -> ../gitee_install.sh
链接的用途👺
直接简化目录名
-
在不影响对当前目录的依赖的同时,为该目录(记为D)起一个别名,可以通过创建D的符号链接来实现
-
特别是使用学校邮箱注册的,创建的目录名老长,还带空格,不好看,但是直接修改会破坏映射关系.\
-
例:
mklink /j d:\org "d:\OneDrive - pop.zjgsu.edu.cn\"
,这就把一个长名字缩短为一个短名字,访问起来更加方便
文件搬家/重定向安装目录
- 对于软件,搬家,可能需要在关机状态下启用修复模式/pe系统下进行
- 有些软件在安装时无法更改安装目录,那么可以先创建默认安装位置符号链接映射到其他位置,甚至是其他分区,然后执行安装,这样文件会被释放到被映射的位置上(不过我个人习惯不分区,就一个C盘,这样移动文件等操作速度都很快,也不用担心C盘而其他盘空时需要挪空间的麻烦)
共享文件夹聚合
- 例如我讲路径
C:\share
设置为共享文件夹,但是我希望共享的内容分散在多个其他目录中 - 当然可以考虑分别为这些目录设置共享文件夹,但是会造成访问入口不一致,需要维护的链接变多等问题
- 而利用符号链接,讲需要共享的目录在
C:\share
下创建对应的符号链接,就可以方便管理要分享哪些目录 - 不过如果共享权限控制的比较严格,那么分别设置共享文件夹可能会更好一些
- 我们可以综合两种方法,完全开放的目录用符号链接聚合方便管理,严格控制的目录单独创建共享文件夹
其他应用
git管理和符号链接
- 查看git在这方面的文档
- Symbolic Links · git-for-windows/git Wiki (github.com)
- version control - How does Git handle symbolic links? - Stack Overflow
ondrive
- 将某些软件的下载目录通过软连接可用定向到onedrive目录实现自动同步,即便软件本身没有提供下载路径的修改功能
windows创建符号链接权限策略修改👺
考虑到windows上symbolicLink是为了兼容Linux/Unix中的Symoblic Link ,并且可以跨分区创建文件或目录的链接,比junction更通用(后者不需要普通权限就可以创建,也可以跨分区,但是仅支持目录)
通过本地安全策略来为用户分配指定权限
任意界面按下win+r
,或者在命令行窗口中输入secpol.msc
(而不是本地组策略gpedit
)打开本地安全策略组
按如下方法将当前用户添加到Create symbolic links
权限组中.
但是修改完成后,注销(logout登出)后再登陆才可以生效.
如果想要允许任何用户创建符号链接,可以添加Everyone用户到该权限组中
其他相关话题
一下话题参见其他文章
- 链接的创建方法
- 链接类型判断
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了