你那句"10开头的字符比2小",方向没错,但机制上可以再精确一点。字符串比较是逐字符按码位比,“10"和"2"比时先比首字符’1’(ASCII 49)和’2’(50),49<50,于是"10”<“2”,比较到这里就停了,后面的’0’根本没机会出场。所以不是"10整体小于2",而是首字符直接拍板,后续字符连比试的资格都没有。
补零这个法子你用着顺手,但它藏着前提:你得提前知道最大编号有几位,并且全程保持一致。01到09没问题,可一旦文件数越过两位数边界、又忘了把补零宽度从2位升到3位,老毛病立刻复发。它更像约定驱动的权宜之计,不是结构性修复。
对症的解法其实是自然排序(natural sort),把连续数字段当数值对待。Windows资源管理器和macOS的Finder一直这么干,所以你在图形界面里几乎从没撞见过这问题——恰恰是自己写脚本时,才头一回直面裸的字典序。这倒反过来印证了你那句"工具替我做了主":从前那些工具在背后偷偷替你做了自然排序,你反而没察觉。
再往下想一层,“机器眼里的排序跟人不一样"这话对,但机器其实一点都不任性,字典序是明确定义且自洽的。出岔子的根子,是用字符串这种表示法去装载一个数值意图,却没告诉排序器"这是数字”。版本号里1.10排在1.2前、日期以字符串存却按字典比,都是同一个坑在现实里反复冒头。你那脚本当年挨的闷棍,整个行业到现在还在挨。