1990年那个冬天,我在一张被暖气烘得发黄的纸上画过一棵树。树干是根目录,枝杈是子目录,叶片就是一个个文件。旁边搁着刚换上的硬盘,通电后会发出轻微的电机声,像某种动物在呼吸。那时我还没听过“文件系统”这四个字,只知道计算机里存东西要有盘符、路径和名字。这一集,我想说的就是名字本身:为什么文件系统要有名字,为什么文件名如此重要,又为什么有些名字能活三十年,有些却像落叶一样,一个冬天就被扫走了。
1. 名字是一切持久性的起点
1.1 没有名字的存储是一堆沉默的磁道
九十年代初,我刚接触个人电脑时,最直观的感受是:磁盘不是一个“地方”,而是一个“仓库”。仓库里如果所有东西都堆在一起,没有任何标签,那它基本等于不存在。格式化完成后,磁盘上是空的,只有一张整齐的目录表像新种下的苗圃,等着被写入名字。就为这件事,我花了一整个下午研究到底该叫“backup”还是“备份”,该分几个文件夹,每个文件夹里又该放什么。后来我才意识到,我其实是在为一棵树设计生长结构。
文件系统的本质,一句话就能讲清:它负责把数据变成有名字的东西。数据本身只是一长串0和1,在磁盘上完全看不出边界;是靠文件系统的目录项,告诉你从哪个扇区到哪个扇区是一首歌、一份文本、一张图。名字,是你和这块磁介质之间的唯一契约。机器不关心你叫它“日记”还是“jrl”,它只负责把这个名字翻译成一串位置信息。但人需要名字,而人使用计算机的方式,决定了文件系统必然以一棵名为“目录树”的形式存在。
1.2 为什么是树,而不是一堵墙
如果让我用一个词概括我对九十年代文件系统的记忆,那就是“树”。根在上,枝叶向下展开。这种设计不是偶然,它来自一个非常朴素的整理学逻辑:分类。人在纸上整理信息时,习惯用目录、章节、分类标签;文件系统从一开始就模仿了这种习惯。每个磁盘有一个根目录,你从根出发,进入子目录,再进入更深的地方,最终找到一片叶子。路径就是从根到叶子的整条路线。
这套结构让我觉得亲切,因为它跟书架一样:你先找到书柜,再找格子,再找书皮上的名字。后来读到资料才知道,这种树形结构在早期系统实验里还有过其他竞争者,比如平铺式,所有文件放在同一层,靠全名区分;又比如索引式,每份文件给出编号,查表找到位置。但树赢得了胜利,因为人脑的导航方式不是“记住编号”,而是“顺着分类往下找”。分类有层级,层级就是树,树就是记忆的自然形态。
1.3 这棵树真的不会落叶吗
现在回看这个系列标题里的“不落叶”,我会觉得它其实是一个反问。树的叶子当然会落,磁盘上的文件当然会被删掉,目录当然会被格式化。所谓“不落叶”,指的从来不是物理上一成不变,而是结构上可以重新生长:哪怕一个文件在春天被覆盖,只要目录树还在、命名规则还在、备份的根还在,明年同一位置还会长出新的文件。我见过很多老工程师,他们整理数据的方式几十年没变过,不是他们守旧,而是那套结构足够通用,能够应对所有新工具。
文件系统的名字,从这个意义上说,就是“光秃秃的枝干上还能长出新叶”的保证。如果你只是把一堆文件丢进硬盘,毫无结构,那你不是在种树,你是在堆落叶。风一吹(断电、误删、坏道),什么都没了。
2. 那些藏在名字里的设计哲学
2.1 有限字符、固定后缀与命名纪律
1990年那会儿的主流存储设备,单盘容量以兆为单位,目录最大层级非常有限,文件名长度也短得可怜。所有文件都要遵守苛刻的命名规则:主名不能太长,后缀不能乱用,大小写有时区分有时不区分。这些限制在今天看起来像枷锁,放到当时却是一种保护:因为空间小、目录浅、字符少,名字几乎一眼就能看懂。
我至今记得一条铁律:后缀要诚实。文档就是文档,图片就是图片,备份就是备份。不要为了凑字数就乱编后缀,更不要为了“想当然”把备份命名成带日期的中文长句。九十年代很多文件名只能写八个字符,大家硬是练出了缩写本事:把“工作总结1990年12月”缩成“gf1209”,看起来简洁,过三个月自己都忘了解释。这件事教育了我:命名的第一原则,不是简洁,而是可逆。所谓可逆,就是光看名字,你至少能猜出它的大致内容、时间、用途和归属。
2.2 索引节点:名字背后的那道根须
真正让我理解了文件系统命名深度的,是后来接触到的“索引节点”概念,这就像树的根须,你看不见,但它把每片叶子牢牢挂在枝干上。文件名存在目录项里,文件本身的数据存在若干块区域,中间靠索引节点连接。目录项里存的是文件名和索引节点号;索引节点里存的是文件大小、权限、时间戳、数据块位置。也就是说,名字和数据是分开管理的。
这套分层设计最大的好处是:改文件名根本不动数据。你可以今天叫它“a.txt”,明天叫它“最终版.txt”,后天叫“老板批了.txt”,数据在磁盘上的位置丝毫不变。看起来只是一个属性变更,实际上这正是持久性的关键。只要目录树没有损坏、索引节点没有丢失,你换再多名字,叶子都还挂在原处。这不正是“不落叶”的又一层含义吗?换名不代表抹除,改名不代表消失,树的身份在更深的地层里。
2.3 根目录、工作目录和“家”:三个值得记一辈子的概念
初学时经常混淆三个目录概念:根目录、当前目录、家目录。根目录是整棵树的起点,路径最左侧那个斜杠;当前目录是你现在站的位置,决定了相对路径的参照点;家目录是你个人数据的归属地,通常存着配置、草稿和收藏。九十年代很多系统还没有明确的“家”概念,所有文件都堆在根下,像没分好的土地,公共区、私人区、临时区混在一起。后来系统演进,每个用户有了自己的目录,才开始有了“私有”和“共享”的界限。
这个分离改变了我管理数据的习惯:我开始把所有的临时文件放在一个叫“tmp”的地方,把长期不动的归档放在另一个地方,把正在写的东西放在当前工作目录结构里。隔离是树健康的根本。如果叶子全长在一个枝上,刮台风一次全掉;分了枝,断一根还有下一根。
3. 给文件系统起好名字的实操方法
3.1 一套可以种三十年的命名法
现在的文件系统早已允许长文件名、中文名、特殊字符,但命名规则反而更需要人脑子里的“约定”。我在这些年里总结出一套通用命名法,适合绝大多数个人电脑和项目目录。
第一步,定根。在存储设备上创建一个根目录,叫“work”,里面对应若干一级子目录。一级目录的命名要按“用途”而不是“时间”来分。比如:project、archive、tmp、software、reference。用途型目录不会随年份过期,时间型目录到了一年就得翻一次,翻着翻着就乱了。
第二步,定项目。每个项目目录内部按下述模板组织:项目代号/阶段/日期_动作.后缀。项目代号必须写在最前面,阶段用短词,日期用数字,动作用动词。比如“platan/design/19901105_draft.txt”,一眼就能看懂:这是名为platan的项目里,设计阶段,1990年11月5日的草稿。
第三步,定版本。所有草案文件都要有版本规则。我习惯用“主版本.分支版本-状态”这种写法,比如“report1.2-review.txt”,状态只允许草稿、评审、发布、归档四种词。千万不要用“最终版”“绝对不改版”“真最终版”这类词,那不是在命名,是在给自己挖坟。
第四步,定日期。日期格式永远用八位数字:年四位、月两位、日两位,不要用“90.12.31”也不要用“12月31日”。数字日期可以排序、可以比较、可以自动识别。九十年代短文件名时代,这个习惯救了我很多次:目录一列按文件名排序,时间顺序自然就出来了。
第五步,定备份。备份文件的名字要包含源目录名字和备份日期。不要因为备份工具自动命名了就不管,你得看得懂哪一份是今天凌晨生成的,哪一份是上星期生成的。否则一趟恢复操作,把你上星期的旧文件当最新文件用,哭都没地方哭。
3.2 用命令把名字“钉”在树上
我不太依赖图形界面,多年来还是用命令行干活。早期文本界面里列目录,输入几个字母,回车,屏幕上刷刷地出现一排名字。好处是快,坏处是眼睛容易花,所以更需要命名规则。当你看到一整屏杂乱的短横线和小写字母时,如果没有规则,你就是站在一片密密麻麻的叶子底下,根本找不到要找的那片。
操作上可以这样练:进入某个项目目录,列出所有文件,假装自己是一个从未见过这些文件的陌生人,只看名字,你能否说出每个文件的用途?如果说不出来,改名字。这个练习听起来很土,但效果奇好。我每年年底会把当年新建的文件全部扫一遍,凡是名字读不通的,全部重命名。重命名用的命令也很简单,就是“mv”之类的移动命令,用多了就熟了。关键不在命令,在于坚持:名字是树皮上的刻痕,你刻了什么,来年春天就长成什么样。
3.3 目录层级不是越深越好
九十年代路径长度有限制,层级深了直接报错,所以大家养成了浅目录习惯。现在的文件系统能容纳很深的路径,反而出现了过度嵌套的毛病。我见过有人把文件放在“work/project/platan/design/2024/version/for_review/backup/old/”里,这个路径本身就成了一种负担。
我的建议是:单个目录里的平级条目不超过二十个,层级不超过五层。二十个条目的上限来自人眼的扫视能力,一眼能数完,就不会漏掉。五层的上限来自记忆的深度,路径超过五层,你背下来就开始吃力。树的枝干不要又细又长,要又短又粗,这样即使某根枝断了,损失的也只是一小片叶子,而不是半棵树。
4. 不落叶的真相:元数据、快照和“内存里的冬天”
4.1 树的过冬机制是元数据
树叶会落,根还在。文件系统不怕文件删除,怕的是目录结构损坏。90年代有个常见故障:断电时目录项还没写完,重启后整片区域变得不可识别,文件都在,名字全丢了。数据还在,但和名字断了联系,这就像树叶落地之后被雪盖住,春天一到,化成一滩泥,再也长不回树上。
所以真正重要的不是备份文件本身,而是备份“名字和数据之间的对应关系”。现代系统里这叫元数据。我养成了一个习惯:每过一段时间,就把整个目录树的结构导出来,存成一个纯文本清单,没有内容,只有路径和文件名。这个清单非常小,几百兆的项目可能只有几十千字节。但它像一张地图,即使某天系统大面积崩溃,只要地图还在,我就能对照着把名字一棵一棵种回去。
4.2 快照:给冬天的树拍一张照片
快照是把文件系统在某一瞬间的目录树完整冻结下来。它不复制所有数据,而是保存一份“当时有哪些名字指向哪些数据”的记录。之后就算文件修改了、删除了,快照里的旧名字和旧数据块还会保留一段时间。这特别像落叶树:你可以在秋天按一次快门,到了冬天大雪覆盖,你仍然能回忆起每一根枝杈的位置。
实操上,我会对重要目录定期做快照。不需要高深工具,很多系统都自带快照功能,没有的话就手动把目录树清单归档到另一个磁盘。关键点是:快照要放在物理上独立的存储上,比如另一块硬盘或另一台机器。同盘的快照防不住硬盘整体报废,只有分开放,才能应对真正的“冬天”。我管这叫“两棵树之间互相挡风”:这棵断了,那棵还在,明年还能用种子再种一遍。
4.3 修剪树枝时不要连根拔起
清理旧文件是维护树健康的重要动作,但很多人清理时太粗暴。我见过有人一键删光某个目录,连带把还没归档的草稿、过期但该留着存证的记录、以及某个只在旧版本里出现过但也算得上前因后果的东西一起删掉。这不是修剪,这是大火烧山。
我的做法是分层修剪。第一层,把超过一年未访问的项目目录压缩打包,扔进archive区;第二层,把archive区里超过三年且明确不需要的文件,转到低速大容量存储上冷存;第三层,只有那些自己都觉得“这到底是什么”的无名文件,才真正删除。整个过程依赖名字:如果清理时你连这个文件是干什么的都看不出来,说明当初命名失职,这时候先别删,先改个看得懂的名字,扔进archive。命名失职不惩罚数据,惩罚的是未来查询数据时的你。
5. 九十年代踩过的坑,还有救回来的办法
5.1 全角中文名在旧系统里变成乱码
九十年代在部分系统下,中文文件名显示正常,但拿到另一台机器上就成了各种乱码,字符编码标准不统一,同名文件在不同地区解释成完全不同的一串字。有一次我把自己整理的目录拿到别人的机器上,打开一看,满屏的符号,一个都认不出来。后来学乖了:跨机器传递时,文件名一律用短小写英文和数字;中文只允许出现在文件内容的第一行标题里,不进文件名。
这个经验放在今天仍有价值:即便现代系统几乎都支持Unicode,但备份工具、压缩格式、不同平台之间的文件系统转换仍然可能因为编码差异产生奇怪行为。最稳妥的策略还是:文件名主结构用ASCII字符,中文说明性的内容统一放进一个前置的注释文件。名字是树的骨头,骨头要用最耐磨的材料,中文可以美,但别当承重墙。
5.2 后缀乱成一片,工具都救不了
有一类问题不是文件系统造成的,而是人自己造成的:后缀名乱用。早期很多工具依赖后缀识别类型,你把图存的“picture.txt”,系统就当作纯文本打开,稀烂地打出乱码;你把脚本存的“script.doc”,编辑器可能就不给你语法高亮,检查半天才发现是后缀问题。还有更糟糕的,有些人喜欢把备份压缩包命名为“bak1”“bak2”,没有任何后缀,系统无法自动关联打开工具。
我现在给所有文件定了一条规则:后缀是对外的身份证明,不要自作聪明地省略,更不要乱接。压缩包叫“xxx.tar.gz”,文档叫“xxx.pdf”或“xxx.md”,程序脚本按运行环境写准。哪怕你用的工具可以自动检测类型,也不要赌,因为自动检测靠的是内容,而内容可以被压缩、加密、包裹,唯独后缀是最诚实的一张名片。
5.3 恢复误删的第一原则是别再写数据
九十年代误删文件之后,我一度以为彻底没救了,就继续在磁盘上装新软件、抄旧文件、写新目录,等到恢复工具到手,那些数据块早被新数据覆盖了。后来有老师傅告诉我一个最朴素的道理:删了文件之后,如果它还重要,第一件事就是断电、停写、去借另一块盘来挂载,用只读方式试图恢复。文件系统删除文件时,通常只是把目录项标记为可用,数据块还躺在原地,但一旦被新数据写进去,那就真的没了。
这个道理放到现在依然是金的。你发现误删、误覆盖之后,别再往原分区写入任何文件,也别打开大型软件让它生成一堆缓存,只用恢复工具扫描原盘,把能找回来的名字和数据都导出来。名字会丢,但根还在;根没动,叶子就还有机会长出来。这大概就是“不落叶”的真正技术含义:存储设备里的数据在被覆盖之前,永远存在一丝可救的余地,可这余地经不起你手欠。
6. 那棵树的名字,最终是你自己
这系列写到第5集,正好是一个节点:前面几集讲了那棵树的由来、根系的伸展、叶片的形状,这一集讲了名字。我想了很久为什么非要用“文件系统的名字”当这一集的名字,直到我改完一批旧文件的文件名后才想明白:文件系统的名字,不只是目录和文件的名字,更是你赋予这套存储秩序的那份意义感。你把这块硬盘叫“生活”,把那块硬盘叫“工作”,第三块叫“存档”,然后你决定哪些东西值得长存、哪些只配留在临时目录、哪些必须在某个冬天被剪掉。说到底,名字是一种伦理:你如何看待数据,决定了数据能活多久。
这几年我再回头整理那些九十年代的旧文件时,发现很多文件内容已经打不开了,当时的软件格式早被淘汰。但那些名字还清清楚楚:目录名、文件名、日期后缀。只要这些名字还在,我就知道当年那片树叶曾经在哪里、朝哪个方向生长过。文件打不开,树已经倒了;但名字还立着,像一棵不落叶的树,在记忆里一直绿着。
最后分享一个我保留至今的习惯:每年开春第一周,我会打开去年整个目录树的备份清单,从头念到尾,念不顺口的就改。这没什么技术含量,但很管用。树不需要你天天浇水,只需要你每年记得它的名字,它就愿意一直替你守着那些叶子。