昨天下午三点,我在办公室里对着两份导出的目录清单,一行一行地数差集。空调声音很大,屏幕上的表格滚到第 400 行时,我发现自己数错了两次——不是眼睛花,是这份清单本身有问题:同一批文件在两个时间点的导出结果里,出现了三种不同的命名格式。那一刻我的火气是压不住的,因为这不是能力问题,是有人在中途改了规则却没有留下任何说明,而后来的所有人都得为这七个月的规则空档付账。

41 个缺失条目,就是在这张表上被数出来的。第一个数字出来时我还以为脚本写错了。

我把这件事完整说一遍,是因为「49图正版库资料库恢复」这个说法在网上被用得过于轻巧。真正的恢复不是点一个按钮然后等进度条,它包含三个彼此独立、顺序不能颠倒的环节:第一,确认你要恢复的对象到底是什么,也就是索引与实体之间的一次对账;第二,确认你手上现有的副本是否可信,也就是校验;第三,把结果写下来,让下一个人不必重做一遍。这三步里,第一步最容易被跳过,第二步最容易被敷衍,第三步几乎没人做。我这次做得也不算好,但至少每一步都留了记录。陈默在 8 月 28 日晚上把一张 2019 年的老截图发给我,截图里一个文件名写着「_v2 终稿」,而现在的系统只认四位年份加短横线的格式——这条线索直接解释了为什么有些条目在线上索引里「查得到、点不开」。

索引和实体对不上,本质是历史断档,不是技术故障。把这句话写下来,能省掉一半的无效排查。

关于恢复的两条原则:旧入口页的时间戳比文件系统修改时间更可靠;同名文件一律以内容哈希为准,文件名不可信。

校验环节我们最后没有用全串 MD5,而是取了前 8 位。理由很实际:全串比对需要维护一份完整的哈希清单,而这份清单本身就是恢复对象之一,一旦清单丢失,比对就无从谈起;前 8 位虽然理论上存在碰撞可能,但在几百个文件的规模里,人工看一眼就能筛掉九成误判,剩下的再逐个开文件确认。这个取舍写在整理笔记第 3 页,我保留了当时的原始截图,连脚本报错的那几行都没删,因为那几行恰好说明了为什么第一次运行漏掉了 6 个文件——路径里有一个中文空格。

回补的第一批 12 个文件来自韩旭 2023 年 11 月做的一份离盘镜像,硬盘标签上写着「整理前」,字迹已经有点糊。谁也没想到它成了这次最干净的来源。这件事让我对「整理」这个词的理解变了一点:整理不是把东西堆整齐,而是让下一个人能看懂你为什么这么放。我们这次给每个批次补了一份 README,写清楚来源、校验方式、已知缺陷。写的时候我意识到,自己过去很多所谓的整理其实只是自娱自乐——没有说明的目录结构,对别人来说等于零。顺便说一句,凡是用图49恢复正常使用免费打开49图库免费下载这类旧说法来指代同一批资源的页面,描述里的批次编号和新索引普遍差 1,按编号检索会整体错位,我们已在新 README 里单独标注。49图库官方网站下载地址这类页面上的历史版本信息,也只作参考,不作依据。

脚本第一次运行漏了 6 个文件,原因是一个中文空格。就一个空格。

索引重建时我把原来的三层目录压成了两层。原来的「年份 / 类型 / 批次」在缺文件的情况下会产生大量空壳目录,空壳目录又会让检索工具误判层级,最终你在界面上看到的是「有这一项、但不显示内容」。压成「类型 / 批次」两层之后,空目录从 63 个降到 4 个,检索路径也短了一截。这个改动看起来很小,却是我这次最满意的部分——因为它解决的是结构问题,而不是一个个补窟窿。49图库下载与安装与澳门49图库更新两条旧记录的批次描述里,还留着三层结构时代的编号写法,我在正文里保留原样,只在括注里换算,不去改原文,这一点我认为很重要:整理不是重写历史。

冲突项一共 5 个,都是「同名不同内容」:文件名相同、大小相同、但内容哈希不同。这种情况最容易出错,因为任何按文件名去重的工具都会静静地把其中一个删掉,而且不会报错。最后定的规则是:不看文件名,只看哈希,同名的全部改名保留。我把这条规则和三个反例一起写进了说明,包括最新imtoken官网下载那条记录里出现的旧命名——它看起来完全无关,但命名风格的演变是同一条线索,能帮人判断某个批次大概属于哪个时期。

顺便说一句我的真实看法:这个领域里大部分所谓「恢复教程」都是噪音。

我把话说重一点:这个领域里大部分所谓「恢复教程」都是噪音,它们提供的是一套听起来合理的动作清单,却从不解释判断标准,读者照着做完,下次遇到不一样的情况照样束手无策。真正有价值的是判断依据——为什么取哈希前 8 位、为什么空目录数量是一个有意义的指标、为什么旧入口页的时间戳比文件系统时间更可信。管家婆正版资料库免费获取那种页面式的说明我也翻过,坦白讲,它们的问题不在于内容错,而在于什么情况都适用,也就等于什么情况都不适用。我宁可写一篇只有 41 条、但每条都能追溯的复盘。

9 月 1 日做了复检:41 条里确认恢复 38 条,剩下 3 条我暂时放弃——两条是重复项,一条是损坏文件,头部结构被覆盖过,修复成本高于收益。这个结果不算漂亮,但每条都有原因,比含糊地写一句「基本完成」要诚实得多。复检时还发现一处此前遗漏的东西:有几个索引文件之间互相引用,形成一个闭环,任何单一入口的还原都会导致其中一环悬空,最后是把它们作为一个整体处理的。这类细节在事前根本想不到,只能在做的时候记下来。

38 / 41。剩下 3 条,我在说明里写清了放弃理由。

写这一篇的时候我又核对了一遍说明文档。目录还在,README 还在,哈希清单也还在。如果你也在做类似的事,我只有一个建议:把判断依据写下来,写得啰嗦一点没关系。具体的文件会丢,具体的判断会留下。这大概就是「收录与整理」六个字里,真正难的那一半。