跳到主要内容

windows文件系统的四种链接方式概念入门

· 阅读需 11 分钟
Norman pong

想象一下:当我们有数据需要实时同步到其他文件夹中,同时不想影响到源数据的结构,尤其面对素材资源与文档分开存放,在某个时刻需要汇总发送给他人。这时就需要用到“文件链接”的功能,文章内容虽然介绍了 windows 系统相关的功能,但也有 Linux 的对比,可作为参考。

  • Lnk 快捷方式1
  • Hard Link 硬链接2
  • Junction 目录联接3(NTFS 文件系统独有)
  • Symbolic Link 软链接或符号链接4(windows vista 及以后版本才有)

由于快捷方式是一种比较直观和易于使用的链接方式,但它实际上是一个独立的文件,只包含路径信息,而不是直接指向目标文件。

平时所说的软、硬链接是针对 NTFS(windows) 或 ext4(Linux) 的文件系统展开的。

NTFS文件系统的三大链接方式

软链接或符号链接的特点

一、符号链接 ≈ 软链接

Windows中的 SymbolicLink(符号链接)等同于Linux中的软链接(soft link或symbolic link)。它们都是创建一个特殊类型的文件,该文件包含指向另一个文件或目录的路径,从而实现了一种间接的引用关系。

SymbolicLink 与 Junctions 在以下方面存在一些区别:

  1. 目标类型:Junctions 只能是目录,而 Symbolic Links 可以指向文件或目录。
  2. 安全性:虽然符号链接在功能性方面更为强大,支持远程定位,但这同时也提高了它们的安全风险。相比之下,Junctions由于被限制在本地路径中,因此相对较安全。

硬链接的特点

什么是硬链接

硬链接是一个指向文件的指针,它指向文件系统中的物理文件

在Linux系统中,硬链接是直接指向文件的inode(索引节点)的链接,因此,硬链接和原始文件在文件系统层面没有任何区别,它们指向的是同一个文件数据块。创建硬链接就是在文件的inode中增加一个新的文件名,因此硬链接不会占用额外的磁盘空间。同时,由于硬链接直接指向文件的inode,因此即使原始文件名被删除,只要硬链接还存在,就可以通过硬链接访问文件的数据。

简单说:需要windows和Linux不同的系统,但是两者对硬链接的定义几乎一样,即两个文件之间通过某种链接,使其保持同步(除删除外)

需在同一个硬盘分区下才能进行链接

对于Linux和Windows的硬链接来说,通常需要在同一个硬盘分区下才能进行。这是因为硬链接是通过文件系统的索引节点或引用计数等机制实现的,跨分区可能无法正确跟踪和管理这些链接关系。以上信息仅供参考,如有需要,建议您咨询专业技术人员。

只能链接文件,无法链接目录

主要是因为目录的循环引用问题。如果允许对目录创建硬链接,就有可能在目录中引入循环,这样在目录遍历时系统就会陷入无限循环当中,导致无法定位到访问目录。为了避免对目录结构的破坏,Linux等系统不允许用户自定义硬链接在目录上。

结果就导致:A --> B --> A --> B...(无限循环)

目录链接 Junction 的特点

Junction 不会导致目录的循环引用问题

Junction不会导致“目录的循环引用问题”是因为Junction只是在文件系统层面上创建了一个指向另一个目录的引用,而并没有实际地将两个目录合并

与硬链接不同,Junction并没有创建一个新的 inode 或者增加文件的引用计数。它仅仅是一个指向另一个目录的路径,不会引入循环引用的可能性。因此,使用 Junction 不会导致目录结构的混乱或循环引用问题。

windows 例子

Linux 可通过 bind mount 实现

Linux可以通过文件夹挂载的方式实现类似Windows Junction的功能。在Linux中,可以使用绑定挂载(bind mount)的方式来实现这一目的。

绑定挂载允许将一个目录树挂载到另一个目录树下的指定位置,类似于 Windows 中的Junction。通过文件夹挂载的方式,可以在 Linux 系统中实现类似的功能,提供便捷的目录导航和访问方式。

mount -o bind <path> <targetPath>

例子

mount -o bind /home/source_dir /opts/linked_dir

git 管理下的不同

  • git 中将 symbolicLinklnk 当做文件处理
  • 而 junction 则会当做普通目录处理,并且做 commit 处理

如何使用文件链接

pwsh 命令

New-Item -ItemType <ItemType> <path> -target <targetPath>
# ItemType(3): SymbolicLink Junction HardLink

创建 symbolicLink 的例子

New-Item -ItemType SymbolicLink .\blog\SymbolDir -Target C:\OneDrive\Application\Obsidian\norman-wiki\未分类\

bash 命令

硬链接

ln <targetPath> <path>

软链接

ln <targetPath> <path>

题外话:将文档放在同步盘中,在项目中建立链接

需求:将文档和项目分离,文档采用标准的 markdown 语法,这样无论将来更换何种静态博客框架,都不影响源数据,保持文档的“纯净、可迁移、可扩展”。

尝试使用软链接和目录链接

使用 symbolicLinkjunction 链接文件夹,而 junction 文件则可以在 git 中识别为正常文件。使用 http-serversimple-http-server 开启简单的文件服务器,在浏览器中可以读取并加载。

另外静态资源图片和录音文件也能成功读取,但是静态网站框架 vitepress 和 docusaurus 也死活无法正确解析 md 并转换为 html 导致无法访问。

失败,最终使用同步软件解决需求

可进行链接静态资源,但对 markdown 文件不生效,最终采用 goodsync 这款同步软件解决问题。

goodsync 不仅能同步本地目录,也能使用网盘、webdav,同时也是一款开源软件,使用 scoop 可一键安装。

关于 scoop 的入门可查看 window包管理

Name           : GoodSync
Description : File Synchronization and Backup Software
Version : 12.1.9.5
Bucket : echo
Website : https://www.goodsync.com
License : BSD-3-Clause (https://spdx.org/licenses/BSD-3-Clause.html)
Updated at : 2023/3/25 22:31:03
Updated by : echoiron
Manifest : C:\Scoop\buckets\echo\bucket\goodsync.json
Installed : c:\Scoop\apps\GoodSync\12.1.9.5
Installed size : Current version: 101.7 MB
Persisted data: 625.1 KB
Cached downloads: 13.6 MB
Total: 115.8 MB
Shortcuts : GoodSync2Go

Footnotes

  1. 快捷方式:这并不是真正的链接,它只是一个指向特定文件或目录的引用,快捷方式本身是一个独立的文件,它包含指向目标文件或目录的路径信息。

  2. 硬链接:Windows的文件硬链接是指向同一个文件系统对象的两个或更多文件名。这些文件名可以在同一目录或不同目录中。与Linux中的硬链接类似,Windows的文件硬链接也是通过引用文件系统的索引节点来实现的。对硬链接文件所做的任何更改都会立即反映到通过引用该文件的链接访问它的应用程序中。

  3. 目录联接:目录联接是Windows中的另一种链接类型,它允许将一个目录的路径连接到另一个目录。目录联接在命令行下创建,并通过NTFS文件系统提供支持。

  4. 符号链接:符号链接类似于Linux中的软链接,它是一个特殊类型的文件,其中包含一个指向另一个文件或目录的文本路径。符号链接在Windows Vista及更高版本中提供。