使 ls 进行合理的排序顺序,但不将希腊字符打印为“??”

使 ls 进行合理的排序顺序,但不将希腊字符打印为“??”

假设我的目录中有以下文件

_y a b c x z β

以下命令按照上帝的意图按上述顺序列出它们:

perl -e '@files = <*>; print join(" ",sort @files)'

这就是我执行 ls 时想要发生的事情。也就是说,我希望它们全部正确显示,包括带有希腊 beta 的那个,并且我还希望它们按某种合理的顺序显示,例如这个,其中文件名中较早的字符总是比较晚的字符更重要一,如果它们不同。

我的 ubuntu 系统上 ls 的默认行为是显示以下内容:

a b c x _y z β

这是因为它试图变得人性化,并且不将下划线视为一个字符。我不想要那种行为。

我可以这样做alias ls='LANG=C ls',这使得排序不支持区域设置。然而,输出是这样的:

_y a b c x z ??

所以现在希腊字母无法正确显示。我想这个环境变量使 ls 将所有内容解释为单字节 ascii 代码,然后 beta 可能是一些不可打印字符的两字节组合。

有什么办法让 ls 做我想做的事吗?

答案1

如果您的语言环境是en_US.UTF-8并且LC_ALL=C ls给您您想要的顺序

LC_COLLATE=C ls

应该给你你想要的顺序显示ββ.

设置LANG为任何 UTF-8 区域设置都应显示ββ.您正在使用en_US.UTF-8,因此无需更改LANG

其中一条评论建议“设置LANG为希腊语并LC_COLLATEC。您的尝试LC_COLLATE="C" LANG="el_EL.UTF-8" ls没有成功,因为:

  • 希腊语言环境是el_GR.UTF-8, 不是el_EL.UTF-8;
  • 即使我错了并且el_EL.UTF-8存在,您(您的操作系统)可能从未从模板生成本地化文件。

可能您还没有为el_GR.UTF-8两者生成文件。要获取它们,您需要编辑/etc/locale.gen并取消注释el_GR.UTF-8,然后运行sudo locale-gen。然后LC_COLLATE=C LANG=el_GR.UTF-8 ls就可以工作了。但同样,您不必这样做,您的en_US.UTF-8内容足以显示ββ。您所需要的只是LC_COLLATE=C更改排序顺序。

答案2

在我的机器上:

$ env LC_COLLATE=C ls
_y  a  b  c  x  z  β

我认为在您的评论中您指定了错误的区域设置,如下所示(我需要-N复制您的输出):

$ env LC_COLLATE=C LANG="sdjf" ls
 _y   a   b   c   x   z  ''$'\316\262'
$ env LC_COLLATE=C LANG="sdjf" ls -N
_y  a  b  c  x  z  ??

如果您只有损坏的语言环境,您可以使用--show-control-chars -N如下标志:

$ env LC_COLLATE=C LANG="sdjf" ls --show-control-chars -N
_y  a  b  c  x  z  β
$ env LANG=C ls -N --show-control-chars
_y  a  b  c  x  z  β

如果重要的话我使用 Ubuntu 20.04.2

相关内容