据我所知,LC_COLLATE=en_US.utf8
与 相比,设置环境变量会改变四件事LC_COLLATE=c
,涉及诸如程序如何ls
对文件进行排序:
- Unicode 字符被保留(而不是被垃圾替换
??
) - 重音符号和变音符号不影响排序顺序
- 大小写差异不影响排序顺序
- 标点符号(例如点)不影响排序顺序
功能 1 在当今时代必不可少。
功能 2 和 3 也很棒,因为它们使处理实际的 Unicode 文件名更加方便。
另一方面,功能 4 在我的日常工作中我发现它非常不利于工作效率,因为它经常为 Linux 文件名产生违反直觉的排序顺序 - 其中点通常用于分隔后缀或指示点文件。我真的无法想象为什么有人认为在对文件名进行排序时忽略点是个好主意。
例如:
$ touch foo.txt foo2.txt foó3.txt foo4.txt
$ LC_COLLATE=en_US.utf8 ls
foo2.txt foó3.txt foo4.txt foo.txt
$ LC_COLLATE=c ls
foo.txt foo2.txt foo4.txt fo??3.txt
两者都不令人满意。我希望这些文件的排序方式如下:
foo.txt foo2.txt foó3.txt foo4.txt
换句话说,就像 一样LC_COLLATE=en_US.utf8
,只是标点符号被视为有效字符(排在字母之前)。
是否存在任何可以执行此操作的 LC_COLLATE 设置?
如果没有支持所有功能 1-3 的标点符号,那么至少有一个支持功能 1(即排序LC_COLLATE=c
但不乱码 Unicode 字符)吗?
答案1
问题 1 是LC_COLLATE=c
语言环境无效。您需要大写C
( LC_COLLATE=C
):
$ LC_COLLATE=c ls -1a
./
../
.sharp
.zharp
Sharp
sharp
szharp
zharp
??harp
$ LC_COLLATE=C ls -1a
./
../
.sharp
.zharp
Sharp
sharp
szharp
zharp
ßharp
我不知道如何进行 unicode 感知排序没有对文件名进行排序,但文件名以顶部的点开头(搜索这个问题的答案就是我最终来到这里的原因):-/