我注意到 Nautilus(GNOME Files) 没有完全按字母顺序排序。
$ touch 1
$ touch 2
$ touch 3
$ touch '!2'
然后文件将按以下顺序显示:!2 1 2 3
。这是完全按字母顺序排序的,因为!
就 ASCII 码而言小于数字。让我们添加更多文件。
$ touch a
$ touch b
$ touch c
$ touch '!b'
文件现在按以下顺序显示:!2 1 2 3 a !b b c
。请注意,!b
出现在 之前b
但之后a
,这意味着文件不再完全按字母顺序排序。
$ touch 01
$ touch 02
$ touch 001
$ touch 002
!2 1 01 001 2 02 002 3 a !b b c
。现在这更令人困惑,因为最初的数字似乎是按字母顺序排序的,但在添加以零开头的文件后,该理论就被打破了。
有趣的是ls
,他不同意鹦鹉螺的观点。
$ which ls
/usr/bin/ls
$ ls
001 002 01 02 1 '!2' 2 3 a ab ac '!b' b ba c
Nautilus 在这里使用什么算法ls
? Debian 稳定 Gnome 文件版本 43.2。
答案1
默认情况下,“ls”使用 libc 语言环境特定的排序顺序,与“sort”使用的排序顺序相同。对于所有*.UTF-8
语言环境 (除了 C.UTF-8
),Glibc 实现了Unicode 排序算法(或者其他的东西接近它) 适应当前区域设置。
(例如,请参阅 'LC_COLLATE' 部分localedata/区域设置/es_ES.)
ls
将的输出与LC_COLLATE=C.UTF-8 ls
(或仅LC_COLLATE=C ls
)进行比较。
Nautilus 使用的算法围绕g_utf8_collate_key_for_filename()由 GLib2 提供。这也是基于区域设置的,但还提供了数字的“自然”排序;源代码有一个解释它是如何运作的。
(鹦鹉螺也有附加代码始终将点文件和备份文件(即.*
和#*
)排序在非点文件之后,其优先级高于排序规则键。)
GNU 'ls' 具有-v
“自然(版本)”排序选项,它更像 Nautilus 那样处理数字(但始终使用 ASCII 顺序而不是区域设置顺序)。同样,“排序”也有-V
.
这是完全按字母顺序排序的!就 ASCII 码而言小于数字
这并不遵循。按 ASCII 码排序不是“按字母顺序排序”。充其量是自然的种类。 (想想自己很幸运,IBM 没有在其 PC 上使用 EBCDIC……)
其一,ASCII 顺序Z
位于 之前a
,即使在英语中,这也明显是非字母顺序的。 (上述两种情况下都将使用区域设置感知排序,AaBbCc..
同时通过指定 C 或 C.UTF-8 作为区域设置来强制 ASCII 顺序ABC..Zabc..
。)
它也只涵盖英文字母;我自己的名字包含非 ASCII 格式的字母字符——“按 ASCII 顺序按字母顺序排序”是对它们的未定义操作,甚至按 Unicode 代码点顺序对它们进行排序也会导致对于任何使用该语言的人来说都不是按字母顺序排列的顺序。 (正确的顺序是 U+0065 < U+0117 < U+0066。)记住“ASCII”中的“A”代表“美国”,而不是“字母”。
另一方面,ASCII 顺序包括实际上不属于字母表的字符,因此在字母顺序中没有权重:
请注意,
!b
出现在 之前b
但之后a
,这意味着文件不再完全按字母顺序排序。
它们完全按字母顺序排序,因为!
不是字母字符,因此两者b
和!b
具有相同的权重。