我说“按字母顺序”,就是“按字母顺序”
在与父亲徒步旅行后,作者发现两人手机拍摄的照片在多数文件管理器中排序混乱。经过探究,他发现问题根源在于现代文件管理器对“字母顺序”的解释:它们会识别文件名中的数字并按其数值大小排序,而不是严格按字符顺序。由于作者的手机在文件名中多用了一个下划线分隔秒和毫秒,导致文件管理器将两人的文件名解析为不同的数字,从而打乱了时间顺序。作者对此感到不满,认为电脑应严格执行用户指令,而非自作聪明地猜测用户意图。
排序混乱的开端
作者和父亲徒步旅行后,将各自用安卓手机拍摄的照片汇总到一个文件夹。这些照片的文件名格式相似,都以 IMG_YYYYMMDD_HHmmss 开头,理论上按字母顺序排序就等于按时间排序。
然而,在不同平台上查看时,排序结果却出乎意料:
- 在 Windows 电脑和 Google Drive 中,照片顺序是错乱的,并非按拍摄时间排列。
- 在 KDE 的 Dolphin 文件管理器中,也出现了同样的问题。
奇怪的是,这些文件管理器都无法正确排序,让人一度怀疑文件名中是否包含特殊的隐藏字符。
唯一的“幸存者”:ls 命令
在几乎所有图形界面文件管理器都“阵亡”的情况下,传统的命令行工具 ls 却能正确地按字母顺序排列文件。
这至少说明,不是所有的软件都在字符串排序这种基础功能上出了问题。但另一方面,这也让找出其他软件的问题所在变得更加困难。
ls 的正确表现证明了文件名本身没有问题,问题出在那些“更智能”的文件管理器上。
“字母顺序”的新定义
作者花了一个多月才想明白问题所在。关键在于一个经典问题:file-9.txt 和 file-10.txt 哪个应该排在前面?
- 严格的字母顺序:
file-10.txt会排在前面,因为字符 '1' 在字符 '9' 之前。 - 现代文件管理器的“智能”排序:它们会识别文件名中的数字部分,并按数值进行比较。因此,它们会认为 9 小于 10,将
file-9.txt排在前面。
显然,现在主流的操作系统和应用都默认采用了这种所谓的“自然排序法”,即便用户请求的是“字母顺序”。
我知道你要求按字母顺序排序,但你肯定不希望
file-10.txt排在file-9.txt前面,对吧?我知道你不想。我甚至都懒得问你,你那糊涂的人类大脑太小了,无法理解这种问题的复杂性。我来替你思考就行了。
问题根源:一个下划线的区别
了解了“智能”排序的原理后,照片排序混乱的原因也水落石出。
- 父亲的手机:文件名格式为
IMG_20250820_055436307.jpg,秒和毫秒连在一起,形成一个巨大的数字055436307。 - 作者的手机:文件名格式为
IMG_20250820_095716_607.jpg,秒和毫秒之间有一个额外的下划线,被文件管理器解析为两个独立的数字095716和607。
正是这个下划线的有无,导致文件管理器在比较文件名时,将一个文件名中的大数字与另一个文件名中的小数字进行比较,最终彻底打乱了原本正确的时间顺序。
作者表示,虽然可以通过重命名文件或修改深藏在配置项里的设置来解决问题,但他更怀念那个电脑只会老老实实听从指令的时代,而不是现在这样总想替用户做决定。