【Windows】硬链接和软链接(OneDrive同步指定目录?)

文章目录

  • 一、场景带入
  • 二、Windows下的硬链接和软链接
    • [2.1 硬链接(Hard Link)](#2.1 硬链接(Hard Link))
    • [2.2 软链接(符号链接,Symbolic Link)](#2.2 软链接(符号链接,Symbolic Link))
    • [2.3 软链接和快捷方式](#2.3 软链接和快捷方式)
    • [2.4 应用场景](#2.4 应用场景)
  • 三、OneDrive中的应用
    • [3.1 错误姿势](#3.1 错误姿势)
    • [3.2 好像可行的尝试](#3.2 好像可行的尝试)
    • [3.3 合理的解决方案](#3.3 合理的解决方案)

一、场景带入

OneDrive是一个非常好用的产品,但当你使用它进行自动备份时,会发现他只支持对几个特定的目录进行备份:

这时就想到了Linux下常见的概念"链接",而Windows也支持链接功能。

【Linux】硬链接 和 软链接。

二、Windows下的硬链接和软链接

更加详细的概念,可以看前面的链接,以前写的文章,Linux下的链接。

2.1 硬链接(Hard Link)

硬链接是指向同一文件内容的多个目录项,使得在不同位置的多个文件名指向同一个文件数据块。硬链接与源文件之间没有主从关系,它们是完全对等的。

特点:

  • 共享数据:硬链接指向相同的文件数据块,因此修改任意一个硬链接会影响所有指向该数据块的硬链接。
  • 不可区分:硬链接之间没有区别,所有链接都是平等的,没有"主"或"次"之分。
  • 删除影响:删除一个硬链接不会删除文件数据,只有当所有指向该文件数据的硬链接都被删除后,文件数据才会被删除。
  • 限制 :硬链接只能在同一卷(partition或者说一个分区、一个不是一类文件系统)上创建,不能跨卷创建。

创建方法:

在 Windows 中,可以使用命令行工具 mklink 创建硬链接。命令格式如下:

cmd 复制代码
mklink /H <硬链接路径> <目标文件路径>

例如,创建一个名为 hardlink.txt 的硬链接,指向 original.txt

cmd 复制代码
mklink /H C:\example\hardlink.txt C:\example\original.txt

mklink用法(这是cmd命令,power shell不能直接用):
MKLINK [[/D] | [/H] | [/J]] Link Target

    /D      创建目录符号链接(软件)。默认(无参数时)为文件符号链接。
    /H      创建硬链接。
    /J      创建目录联接(软链接,不能跨区)。
    Link    指定新的符号链接名称。
    Target  指定新链接引用的路径(相对或绝对)。

/J和/D都可以创建软链接,/J的兼容性和透明性很好,但是它不能跨区。硬链接只能用于文件,不能用于目录。

2.2 软链接(符号链接,Symbolic Link)

软链接(符号链接 )是指向另一个文件或目录的引用,它们包含目标文件或目录的路径,而不是实际的数据。软链接类似于快捷方式。

特点:

  • 指向目标:软链接指向文件系统中的另一个文件或目录,包含目标文件或目录的路径。
  • 独立性:软链接是独立的文件,可以位于与目标文件或目录不同的位置。
  • 灵活性:可以创建指向任何位置的软链接,无论是本地文件系统还是远程文件系统。
  • 方便更新:如果目标文件或目录发生变化,软链接无需修改,只需确保其指向的路径正确。

创建方法:

在 Windows 中,可以使用命令行工具 mklink 创建软链接。命令格式如下:

cmd 复制代码
mklink [/D] <软链接路径> <目标路径>

其中,/D 参数用于创建指向目录的软链接。如果省略 /D 参数,则创建指向文件的软链接

例如,创建一个名为 symlink.txt 的软链接,指向 original.txt

cmd 复制代码
mklink C:\example\symlink.txt C:\example\original.txt

创建一个名为 symlinkDir 的软链接,指向 originalDir 目录:

cmd 复制代码
mklink /D C:\example\symlinkDir C:\example\originalDir

2.3 软链接和快捷方式

Windows 的快捷方式(Shortcut)与软链接(Symbolic Link)类似,但它们在实现和用途上有所不同。以下是两者的详细比较:

(1)Windows 快捷方式

  • 特性

    1. 文件类型 :快捷方式是一个特殊的文件,通常具有 .lnk 扩展名。
    2. 内容:快捷方式文件包含目标文件或目录的路径,以及图标、工作目录、描述等其他信息。
    3. 创建工具:可以通过文件资源管理器的右键菜单创建,也可以使用脚本或编程方式创建。
    4. 功能:主要用于创建桌面或菜单中的快捷访问路径,用户双击快捷方式时,会打开其指向的目标文件或目录。
  • 示例

    在文件资源管理器中,右键点击文件或目录,选择"发送到"->"桌面快捷方式"即可创建一个快捷方式。

(2)软链接(Symbolic Link)

  • 特性
    1. 文件类型:软链接是文件系统中的一种链接类型,可以指向文件或目录。
    2. 内容:软链接本质上是一个指向目标文件或目录路径的文件系统条目。
    3. 创建工具 :需要使用命令行工具 mklink 或 PowerShell 的 New-Item cmdlet 创建。
    4. 功能:提供与目标文件或目录相同的访问方式,用户访问软链接时,就像访问目标文件或目录本身。

(3)比较

  • 实现方式:快捷方式是一个独立的文件,包含了指向目标的路径和其他元数据;软链接是文件系统层级的链接,直接指向目标路径。
  • 访问方式:双击快捷方式会通过操作系统处理并打开目标;访问软链接时,操作系统直接将其视为目标文件或目录的一部分。
  • 用途:快捷方式通常用于用户界面的快捷访问;软链接用于文件系统级别的文件和目录组织。

Windows 快捷方式和软链接在实现和使用场景上有所不同。快捷方式更适合于用户界面的快捷访问和导航,而软链接则更适合于文件系统级别的链接和组织。尽管它们在功能上有相似之处,但它们并不完全相同。

2.4 应用场景

  • 硬链接:适用于需要在同一卷内共享数据而不复制文件内容的情况。例如,同一文件的多个副本保持一致。
  • 软链接:适用于需要跨卷、跨目录、甚至跨网络位置访问文件或目录的情况。例如,创建快捷方式或替代目录结构。

三、OneDrive中的应用

本节指的是你需要OneDrive的自动同步功能,而不是简单的云存储功能。

在 Windows 操作系统中,文档、图片、音乐和视频等文件夹是系统预定义的特殊文件夹,通常称为用户文件夹(User Folders)或个人文件夹(Personal Folders)。这些文件夹的主要作用是方便用户组织和管理不同类型的个人文件。

这些目录默认在用户目录下,也即操作系统所在分区下,如果你使用这些目录、且像传统做法一样给电脑分了C盘、D盘等、且C盘不太大,就可以在这些文件夹上右键---属性,在位置选项下修改默认存储位置。

OneDrive 通过客户端软件在本地创建一个同步文件夹(默认位于用户主目录下,断开OneDrive账户链接,在其他位置新建OneDrive文件夹即可改变默认位置,但没必要),并通过网络通信将本地文件夹与云端存储保持同步。这种机制允许用户在多个设备上访问和管理相同的文件,提供了数据备份和跨设备访问的便利性。通过文件系统监控、增量同步(只传改动部分)和冲突处理等技术,OneDrive 实现了高效和可靠的文件同步服务

3.1 错误姿势

文章开头讲到,Onedrive的自动备份功能,只能备份这几个目录,没有其他选项,要想给其他目录添加自动备份功能,可以在这些目录下面为目标文件或目录添加链接吗?

根据前面讲的,硬链接(/H)只能用于文件,不能跨区(或者说跨卷、跨越文件系统);软链接(/D)可以用于文件和目录,可以跨区;目录链接(/J)是不能跨区的用于目录的软链接。根据需要设置即可,通常选择软链接。

如,我在视频文件夹下为F盘的download 文件夹添加软链接:

命令(直接使用CMD也可以的,命令就是前面讲到的,都需要管理员权限打开终端命令行):

bash 复制代码
New-Item -ItemType SymbolicLink -Path C:\Users\14134\Videos\VideoBackup -Target  F:\download  

CMD示例:

bash 复制代码
mklink /D C:\Users\14134\Videos\test   F:\download

软链接只是指向所链接的文件或目录,不会占用和目标相似的空间,只会占用极小的空间(最多几个字节左右),硬链接一点额外空间也不占。

但你在Windows中在软链接上右键、属性,他会显示目标文件或目录的大小,dir /s命令也是如此,这只是一个逻辑问题,便于你通过链接文件也能查看目标的大小信息。

用下面的方法就可以看到软链接文件本身的大小(powershell):

bash 复制代码
# 替换为你的软链接文件路径
$linkPath = "C:\Users\14134\Videos\VideoBackup"
# 获取软链接文件信息
$linkInfo = Get-Item -Path $linkPath
# 输出软链接文件的大小
Write-Host "软链接文件大小: $($linkInfo.Length) 字节"

或者使用Disk Genius软件,可以看到这个文件夹是空的。


现在使用OneDrive备份"视频"这个目录,你会发现:


再使用硬链接:

OneDrive可以备份了:

同样的,目录链接也是不能备份的。


原因:

  • OneDrive是跨设备、跨系统的备份系统;
  • 硬链接可以代表目标本身,而符号链接只是目标的路径;
  • 软链接若能备份,则会有这些危险:跨平台一致性、恶意链接、数据完整性、循环引用等。

3.2 好像可行的尝试

若是直接在OneDrive目录下创建软链接呢?

即将前面的"图片、视频、文档"等支持备份的目标直接更换为OneDrive文件夹:

bash 复制代码
C:\Users\14134\OneDrive
bash 复制代码
C:\Users\14134\Videos>mklink /D C:\Users\14134\OneDrive\VideoBackup   F:\download
为 C:\Users\14134\OneDrive\VideoBackup <<===>> F:\download 创建的符号链接

可以看到OneDrive立刻开始了备份:


看起来解决问题了。

其实,问题不少:

  1. 本地或云端修改、增删的操作都不会自动与另一侧同步,需要手动 关/开 OneDrive的备份开关;
  2. 这是软链接本身特性以及OneDrive限制导致的;
  3. 这好像只用了OneDrive的备份、存储功能,并不能自动同步。

OneDrive 同步特定文件夹中的文件,例如桌面、文档和图片、OneDrive文件夹,是因为这些文件夹通常包含个人用户需要经常访问和更新的文件。OneDrive 会持续监控这些文件夹中的更改,并在检测到更改时自动将它们同步到云端。OneDrive 无法自动同步软链接指向的文件夹内容更改,主要有以下几个原因:

  1. 技术限制: OneDrive 同步功能是基于文件系统更改的。当文件或文件夹发生更改时,OneDrive 会收到操作系统通知,并相应地更新云端中的文件。然而,软链接是一种文件系统指针,指向另一个文件或文件夹的位置。当软链接指向的文件或文件夹发生更改时,OneDrive不会收到操作系统通知,因为更改发生在软链接本身之外

  2. 复杂性问题: 如果 OneDrive 能够自动同步软链接指向的文件夹内容更改,则需要额外的逻辑来跟踪软链接并识别何时需要更新它们。这将增加 OneDrive 的复杂性,并可能导致性能问题。

  3. 潜在风险: 允许 OneDrive 自动同步软链接指向的文件夹内容更改可能会带来潜在风险。例如,如果用户不小心删除或移动了软链接指向的文件或文件夹,OneDrive可能会继续尝试同步它们,导致数据丢失或损坏。

  4. 替代方案: 为了解决这些限制,OneDrive 提供了其他方法来同步软链接指向的文件夹内容。用户可以手动将软链接指向的文件夹复制到 OneDrive文件夹中,或者使用第三方备份工具来同步它们。

这些也是OneDrive尚未支持自动同步自定义目录的部分原因。

3.3 合理的解决方案

(1)将需要同步的内容本身放在支持同步的那些目录下面

包括:文档、图片、视频、音乐、桌面和OneDrive文件夹。

如果你没有给硬盘分区的好习惯,或者有一个1TB的系统盘,这是个很方便、好用的做法。

(2)编写脚本辅助

如果你一定要使用软链接的方式,我有一个参考:你在(仅)OneDrive文件夹下删除内容的时候,它会同步你的软链接指向目标的更改。

可以写个bat脚本,就新建和删除辅助文件(OneDrive文件夹下),用来同步你的软链接更改。不过这依然是手动同步,和开关OneDrive的同步开关是一样的。

(3)借助同步软件

使用(1)的方法虽然很好,但如果你想同步你的一个工作目录(放在了支持自动同步的那几个目录下),就可能会有这几个问题:

  1. 工作文件改动极其频繁,而OneDrive同步实时性极强,这可能会消耗一点点CPU和网络资源;
  2. 你只想定时备份,比如每天要下班的时候。

这时候,就可以考虑使用同步软件来完成这些需求了。

比如:https://www.goodsync.com/cn

该软件支持跨平台、双向同步、自动同步、文件过滤、脚本等功能。常见云存储均可链接,如:OneDrive、Google Drive、iCloud、Dropbox、MEGA、SFTP等(不过是付费的$20一年,一个月试用)。

一边选择本地文件夹,一边选择OneDrive(登录后选)的文件夹:

在设置中选择双向同步(如果只备份就选择单向),在自动选项下即可设置同步的时机,计划里面还可以设置定时同步:

设置后保持后台运行即可,测试发现同步功能确实好用,两端操作后同步很及时。

免费版不能自动实时同步,$20一年如果贵的话,网上有那种。或者试试别的备份软件,不展开说了。

(4)其他云存储

使用OneDrive相对来说是最划算的,Microsoft 365家庭版,一个人一年就几十,容量1TB。

Google Drive、iCloud、阿里云、百度云也可以用,基本都支持同步自定义文件夹。或者结合Alist、RaiDrive等软件使用。

相关推荐
九鼎科技-Leo2 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Yang.994 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
我不瘦但很逗5 小时前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows
ashane13146 小时前
Java list
java·windows·list
万里沧海寄云帆6 小时前
Word 插入分节符页码更新问题
windows·microsoft·word
dot.Net安全矩阵7 小时前
.NET 通过模块和驱动收集本地EDR的工具
windows·安全·web安全·.net·交互
编程修仙9 小时前
Collections工具类
linux·windows·python
程序员小羊!10 小时前
高级 SQL 技巧讲解
windows
xiangshangdemayi12 小时前
Windows环境GeoServer打包Docker极速入门
windows·docker·容器·geoserver·打包·数据挂载
a_安徒生12 小时前
window系统改为Linux系统
linux·windows·centos·系统安全