sml*_*mls 6 linux shell locale unicode sorting
据我所知,设置环境变量LC_COLLATE=en_US.utf8与 相比改变了四件事LC_COLLATE=c,关于程序如何ls对文件进行排序:
??垃圾替换)功能 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
Run Code Online (Sandbox Code Playgroud)
两者都不令人满意。这就是我希望对这些文件进行排序的方式:
foo.txt foo2.txt foó3.txt foo4.txt
Run Code Online (Sandbox Code Playgroud)
换句话说,就像 with 一样LC_COLLATE=en_US.utf8,只是标点符号被视为重要字符(在字母之前排序)。
是否存在执行此操作的任何 LC_COLLATE 设置?
如果没有支持所有功能 1-3 的标点符号,是否至少有一个支持功能 1(即排序LC_COLLATE=c但不乱码 Unicode 字符)?
第一个问题是这LC_COLLATE=c是一个无效的区域设置。您需要大写C( LC_COLLATE=C):
$ LC_COLLATE=c ls -1a\n./\n../\n.sharp\n.zharp\nSharp\nsharp\nszharp\nzharp\n??harp\n\n$ LC_COLLATE=C ls -1a\n./\n../\n.sharp\n.zharp\nSharp\nsharp\nszharp\nzharp\n\xc3\x9fharp\nRun Code Online (Sandbox Code Playgroud)\n\n我不知道如何在不排序以点开头的文件名的情况下进行 unicode 感知排序(搜索这个问题的答案就是我最终在这里的方式):-/
\n