我试图让 Linux 在对文件名进行排序时包含特殊字符。我想要实现的排序顺序是:首先是所有特殊字符,然后是数字,然后是字母(不区分大小写)。
Linux 中的默认排序完全忽略特殊字符(请参阅示例中的第一列“ls-before”)。
我发现的一个建议是使用LC-COLLATE=C
or LC_ALL=C
。这确实考虑了特殊字符,但它们的排序方式很奇怪:有些在数字之前排序,有些在数字和大写字母之间排序,下划线放在大写和小写字母之间。所有大写字母都位于所有小写字母之前。也不是我想要的(示例中的第二列)。
我尝试过编辑 /usr/share/i18n/locales/iso14651_t1_common
:将带有特殊字符的行从 更改IGNORE;IGNORE;IGNORE
为<RES-1>;IGNORE;IGNORE
例如<U005F> IGNORE;IGNORE;IGNORE;<U005F> # 33 _
到<U005F> <RES-1>;IGNORE;IGNORE;<U005F> # 33 _
然后我重新编译了语言环境(en_GB)sudo localedef -i en_GB -f UTF-8 -vc en_GB
(我没有更改语言环境本身)
现在对文件进行排序确实包含特殊字符,并且它们都出现在数字之前(这就是我想要的),但特殊字符似乎仅用于分组,而不用于排序(请参阅示例中的“ls-after”列)。排序似乎是基于特殊字符后面的字符。对特殊字符进行排序应该产生更类似于“所需”列的结果。
例子:
ls-before LC_COLLATE=C caja nemo ls-after desired
----------- ------------ ----- ----- -------- -------
1 %b 1 1 =a =a
11 1 2 2 _a =b
111 11 3 3 =b _a
2 111 11 11 _b _b
3 2 111 111 %b %b
a 3 =a a 1 ..
=a =a _a =a 11 ..
_a =b =b _a 111 ..
A A _b A 2 ..
aa AA %b aa 3 ..
AA AB a AA a ..
ab Ab A ab A ..
a_b B a_b a_b a_b a_b
a-b BB a-b a-b a-b a_c
a#b _a a#b a#b a#b a_C
a%b _b a%b a%b a%b a-b
aB a a_c aB a_c a-c
Ab a#b a-c Ab a-c a#c
AB a%b a_C AB a_C a&c
ac a-b aa ac aa ..
a_c a-c AA a_c AA ..
a-c aB ab a-c ab ..
a_C a_C aB a_C aB ..
b a_b Ab b Ab ..
=b a_c AB =b AB ..
_b aa ac _b ac ..
%b ab b %b b ..
B ac B B B ..
bb b bb bb bb ..
BB bb BB BB BB ..
有谁知道如何真正对特殊字符进行排序而不是仅仅对它们进行分组?
顺便说一句,我希望所有应用程序都遵循新的排序,但看起来每个应用程序都有自己的文件排序规则(请参阅“caja”和“nemo”列)。有没有办法强制每个应用程序遵循相同的排序,或者排序是在应用程序中硬编码的?我的交替iso14651_t1_common
对 Nemo 中的排序没有影响,但使 Caja 表现得像 Nemo。
使用 Linux mint 18.3 伴侣。不确定这是否重要,但我使用的是双引导系统,数据位于 NTFS 驱动器上,因此任何解决方案也应该适用于 NTFS。
谢谢!