重复文件这个问题,几乎每个用Windows的人都会遇到:下载目录里躺着三份名字差不多的安装包,项目备份文件夹里塞着一堆内容一模一样的素材,微信缓存和文档文件夹里同一个图片被存了好几遍。以前我处理这些文件只有两个办法,要么手动对比文件名然后删,要么装个重复文件扫描工具把重复项列出来再一个个确认删除。但手动删最大的问题是:你删的可能是一个正在被某个软件引用的副本,而那个软件保存的路径,恰恰指向你删掉的那一个。
后来我换了一种思路,用EternalBlaze配合Windows的NTFS硬链接做合并,不再删除任何可见文件,而是让多份重复文件在磁盘层面共用同一份真实数据。效果是:所有文件路径保持不变、程序读到的内容完全一致,但磁盘占用大幅下降。这篇文章我把完整流程整理成三步,同时把硬链接的原理、备份策略、参数选型和容易踩的坑一并写清楚,适合刚刚接触数据去重的朋友,也适合想了解NTFS底层机制后再动手的开发者。
1. 硬链接到底是什么,为什么它是重复文件合并的最佳解法
1.1 一个懒人版解释:图书馆索引卡
想真正理解EternalBlaze这类工具做了什么,首先要清楚NTFS文件系统里“文件”和“文件数据”的关系。早期的文件系统里,文件名和数据是一一捆绑的,一个文件就是磁盘上的一整块数据区域。NTFS引入了一个中间层:磁盘上有一个主文件表(MFT)的索引,里面记录着每份文件的实际数据存放在哪里,而你在资源管理器里看到的文件名,其实是一个指向MFT记录的“目录项”。
可以这样理解,磁盘上真正存储的是“一本书的内容”,你在每个目录里创建的文件名,只是这本书的“索引卡片”。正常情况下,一份书的内容只有一张索引卡,所以文件和数据一一对应。硬链接,就是给同一本书内容额外添加几张索引卡,每张卡放在不同的目录下,名字也可以不同,但翻开任何一张卡,拿到的都是同一本书。
合并重复文件,本质上就是把两个本来是“各自复制了一套书的内容”的目录项,改成“共用一个书内容”的目录项。EternalBlaze做的事情,就是找到哪些内容相同的文件,然后把冗余的那几个文件名改成硬链接,让它们指向同一条MFT记录。这个过程不会改变任何文件的可见路径,不会丢失文件名,程序打开任何一个文件时拿到的都是完整内容,唯一的区别是磁盘上只保留了一份真实数据。
这个类比可以解释为什么硬链接合并比“删掉重复项”更安全:你并没有把任何路径从磁盘上移除,只是让多个路径指向同一份数据。对用户而言,目录层级、文件名一个都不少;对应用而言,指定路径上的文件仍然存在,只是占用空间变少了。
1.2 硬链接与快捷方式、软链接的关键区别
很多朋友会把硬链接和快捷方式、符号链接(软链接)混为一谈,这里必须分清楚。快捷方式就是一个独立的.lnk小文件,大小通常只有几百字节到几KB,双击后系统再去目标路径找真正的文件。一旦目标文件被移动或重命名,快捷方式就会失效。符号链接则是一个特殊的目录项,保存的是目标路径的字符串,它比快捷方式更透明,大部分程序可以无障碍地通过符号链接访问真实文件,但如果被链接的目标被删除,符号链接本身就成了“断链”。
硬链接跟这两者最大的不同在于:它没有“目标路径”这个概念。硬链接本身就是这个文件的另一个有效名字,系统不存在“这个链接指向哪里”的解析过程。所以硬链接永远不会因为目标文件移动、重命名而失效,只要还有一个硬链接指向这条数据,这个文件就都是真实存在的。只有当最后一个硬链接被删除时,这份数据才会真正被系统回收。
此外,硬链接有几个限制条件必须记牢:第一,创建硬链接时,源文件和链接必须在同一个卷(同一个盘符分区)上,FAT32和exFAT文件系统不支持硬链接,只有NTFS和ReFS支持;第二,不能对文件夹创建硬链接,只能对单独文件创建;第三,在Windows上创建硬链接通常需要管理员权限,否则会报拒绝访问。这些限制在后面操作中都会遇到,提前知道能省不少排查时间。
