我说“按字母顺序”,就是“按字母顺序”

在与父亲徒步旅行后,作者发现两人手机拍摄的照片在多数文件管理器中排序混乱。经过探究,他发现问题根源在于现代文件管理器对“字母顺序”的解释:它们会识别文件名中的数字并按其数值大小排序,而不是严格按字符顺序。由于作者的手机在文件名中多用了一个下划线分隔秒和毫秒,导致文件管理器将两人的文件名解析为不同的数字,从而打乱了时间顺序。作者对此感到不满,认为电脑应严格执行用户指令,而非自作聪明地猜测用户意图。

排序混乱的开端

作者和父亲徒步旅行后,将各自用安卓手机拍摄的照片汇总到一个文件夹。这些照片的文件名格式相似,都以 IMG_YYYYMMDD_HHmmss 开头,理论上按字母顺序排序就等于按时间排序。

然而,在不同平台上查看时,排序结果却出乎意料:

    • 在 Windows 电脑和 Google Drive 中,照片顺序是错乱的,并非按拍摄时间排列。
    • 在 KDE 的 Dolphin 文件管理器中,也出现了同样的问题。

奇怪的是,这些文件管理器都无法正确排序,让人一度怀疑文件名中是否包含特殊的隐藏字符。

唯一的“幸存者”:ls 命令

在几乎所有图形界面文件管理器都“阵亡”的情况下,传统的命令行工具 ls 却能正确地按字母顺序排列文件。

这至少说明,不是所有的软件都在字符串排序这种基础功能上出了问题。但另一方面,这也让找出其他软件的问题所在变得更加困难。

ls 的正确表现证明了文件名本身没有问题,问题出在那些“更智能”的文件管理器上。

“字母顺序”的新定义

作者花了一个多月才想明白问题所在。关键在于一个经典问题:file-9.txtfile-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,秒和毫秒之间有一个额外的下划线,被文件管理器解析为两个独立的数字 095716607

正是这个下划线的有无,导致文件管理器在比较文件名时,将一个文件名中的大数字与另一个文件名中的小数字进行比较,最终彻底打乱了原本正确的时间顺序。

作者表示,虽然可以通过重命名文件或修改深藏在配置项里的设置来解决问题,但他更怀念那个电脑只会老老实实听从指令的时代,而不是现在这样总想替用户做决定。