想象一下:当我们有数据需要实时同步到其他文件夹中,同时不想影响到源数据的结构,尤其面对素材资源与文档分开存放,在某个时刻需要汇总发送给他人。这时就需要用到"文件链接"的功能,文章内容虽然介绍了 windows 系统相关的功能,但也有 Linux 的对比,可作为参考。
- Lnk 快捷方式
- Hard Link 硬链接
- Junction 目录联接(NTFS 文件系统独有)
- Symbolic Link 软链接或符号链接(windows vista 及以后版本才有)
由于快捷方式是一种比较直观和易于使用的链接方式,但它实际上是一个独立的文件,只包含路径信息,而不是直接指向目标文件。
平时所说的软、硬链接是针对 NTFS(windows) 或 ext4(Linux) 的文件系统展开的。
NTFS文件系统的三大链接方式
软链接或符号链接的特点
一、符号链接 ≈ 软链接
Windows中的 SymbolicLink(符号链接)等同于Linux中的软链接(soft link或symbolic link)。它们都是创建一个特殊类型的文件,该文件包含指向另一个文件或目录的路径,从而实现了一种间接的引用关系。
二、SymbolicLink 与 Junctions 的区别
SymbolicLink 与 Junctions 在以下方面存在一些区别:
- 目标类型:Junctions 只能是目录,而 Symbolic Links 可以指向文件或目录。
- 安全性:虽然符号链接在功能性方面更为强大,支持远程定位,但这同时也提高了它们的安全风险。相比之下,Junctions由于被限制在本地路径中,因此相对较安全。
硬链接的特点
什么是硬链接
硬链接是一个指向文件的指针,它指向文件系统中的物理文件。
在Linux系统中,硬链接是直接指向文件的inode(索引节点)的链接,因此,硬链接和原始文件在文件系统层面没有任何区别,它们指向的是同一个文件数据块。创建硬链接就是在文件的inode中增加一个新的文件名,因此硬链接不会占用额外的磁盘空间。同时,由于硬链接直接指向文件的inode,因此即使原始文件名被删除,只要硬链接还存在,就可以通过硬链接访问文件的数据。
简单说:需要windows和Linux不同的系统,但是两者对硬链接的定义几乎一样,即两个文件之间通过某种链接,使其保持同步(除删除外)
需在同一个硬盘分区下才能进行链接
对于Linux和Windows的硬链接来说,通常需要在同一个硬盘分区下才能进行。这是因为硬链接是通过文件系统的索引节点或引用计数等机制实现的,跨分区可能无法正确跟踪和管理这些链接关系。以上信息仅供参考,如有需要,建议您咨询专业技术人员。
只能链接文件,无法链接目录
主要是因为目录的循环引用问题。如果允许对目录创建硬链接,就有可能在目录中引入循环,这样在目录遍历时系统就会陷入无限循环当中,导致无法定位到访问目录。为了避免对目录结构的破坏,Linux等系统不允许用户自定义硬链接在目录上。
结果就导致:A --> B --> A --> B...(无限循环)
目录链接 Junction 的特点
Junction 不会导致目录的循环引用问题
Junction不会导致"目录的循环引用问题"是因为Junction只是在文件系统层面上创建了一个指向另一个目录的引用,而并没有实际地将两个目录合并。
与硬链接不同,Junction并没有创建一个新的 inode
或者增加文件的引用计数。它仅仅是一个指向另一个目录的路径,不会引入循环引用的可能性。因此,使用 Junction 不会导致目录结构的混乱或循环引用问题。
Linux 可通过 bind mount 实现
Linux可以通过文件夹挂载的方式实现类似Windows Junction的功能。在Linux中,可以使用绑定挂载(bind mount)的方式来实现这一目的。
绑定挂载允许将一个目录树挂载到另一个目录树下的指定位置,类似于 Windows 中的Junction。通过文件夹挂载的方式,可以在 Linux 系统中实现类似的功能,提供便捷的目录导航和访问方式。
xml
mount -o bind <path> <targetPath>
例子
bash
mount -o bind /home/source_dir /opts/linked_dir
git 管理下的不同
- git 中将
symbolicLink
和lnk
当做文件处理 - 而 junction 则会当做普通目录处理,并且做
commit
处理
如何使用文件链接
pwsh 命令
xml
New-Item -ItemType <ItemType> <path> -target <targetPath># ItemType(3): SymbolicLink Junction HardLink
创建 symbolicLink
的例子
sql
New-Item -ItemType SymbolicLink .\blog\SymbolDir -Target C:\OneDrive\Application\Obsidian\norman-wiki\未分类\
bash 命令
硬链接
xml
ln <targetPath> <path>
软链接
xml
ln <targetPath> <path>
题外话:将文档放在同步盘中,在项目中建立链接
需求:将文档和项目分离,文档采用标准的 markdown 语法,这样无论将来更换何种静态博客框架,都不影响源数据,保持文档的"纯净、可迁移、可扩展"。
尝试使用软链接和目录链接
使用 symbolicLink
或 junction
链接文件夹,而 junction
文件则可以在 git 中识别为正常文件。使用 http-server
或 simple-http-server
开启简单的文件服务器,在浏览器中可以读取并加载。
另外静态资源图片和录音文件也能成功读取,但是静态网站框架 vitepress 和 docusaurus 也死活无法正确解析 md
并转换为 html
导致无法访问。
失败,最终使用同步软件解决需求
可进行链接静态资源,但对 markdown 文件不生效,最终采用 goodsync 这款同步软件解决问题。
goodsync 不仅能同步本地目录,也能使用网盘、webdav,同时也是一款开源软件,使用 scoop
可一键安装。
关于 scoop 的入门可查看 window包管理
bash
Name : GoodSyncDescription : File Synchronization and Backup SoftwareVersion : 12.1.9.5Bucket : echoWebsite : https://www.goodsync.comLicense : BSD-3-Clause (https://spdx.org/licenses/BSD-3-Clause.html)Updated at : 2023/3/25 22:31:03Updated by : echoironManifest : C:\Scoop\buckets\echo\bucket\goodsync.jsonInstalled : c:\Scoop\apps\GoodSync\12.1.9.5Installed size : Current version: 101.7 MB Persisted data: 625.1 KB Cached downloads: 13.6 MB Total: 115.8 MBShortcuts : GoodSync2Go