我怎样才能让“ls”首先显示点文件并保留 unicode 文件名?

我怎样才能让“ls”首先显示点文件并保留 unicode 文件名?
$ export LC_ALL=en_US.UTF-8
$ ls -al
total 24
drwxr-xr-x 6 pi pi 4096 Jul 23 16:34 .
drwxr-xr-x 9 pi pi 4096 Jul 23 16:33 ..
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 .A
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 B
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 .C
drwxr-xr-x 2 pi pi 4096 Jul 23 16:34 你好嗎

当我更改LC_ALL为时C,点文件首先列出,但 unicode 文件名不可读:

$ export LC_ALL=C
$ ls -al
total 24
drwxr-xr-x 6 pi pi 4096 Jul 23 16:34 .
drwxr-xr-x 9 pi pi 4096 Jul 23 16:33 ..
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 .A
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 .C
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 B
drwxr-xr-x 2 pi pi 4096 Jul 23 16:34 ?????????

我怎样才能让“ls”首先显示点文件并保留 unicode 文件名?

更新,找到解决方案(感谢 Ярослав Рахматуллин 的回答):

$ cat /etc/default/locale 
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_COLLATE=C

重新启动,显示环境:

$ env | grep -E 'LANG|LC'
LC_COLLATE=C
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE=en_US.UTF-8

按预期排序:

$ ls -al
total 24
drwxr-xr-x 6 pi pi 4096 Jul 23 16:34 .
drwxr-xr-x 9 pi pi 4096 Jul 24 08:29 ..
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 .A
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 .C
drwxr-xr-x 2 pi pi 4096 Jul 23 16:33 B
drwxr-xr-x 2 pi pi 4096 Jul 23 16:34 你好嗎

没有来自以下方面的警告perl -v

$ perl -v

This is perl 5, version 14, subversion 2 (v5.14.2) built for arm-linux-gnueabihf-thread-multi-64int
(with 80 registered patches, see perl -V for more detail)

Copyright 1987-2011, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

答案1

哦,你的假设似乎不正确。也就是说,即使没有 LC_ALL,我也可以列出中文文件。

wraptor: ~/tmp/god-damn-mongorians
$ LC_ALL=C

$ ll
-rw-r--r-- 1 0K 2013-07-23 12:50 ??????????????????

$ unset LC_ALL

$ ll
-rw-r--r-- 1 0K 2013-07-23 12:50 我很好,谢谢

$ LANG=en_US.iso-8859-1

$ ll
-rw-r--r-- 1 0K 2013-07-23 12:50 ?▒???▒??好?▒??谢?谢

为了实现您的目标,您需要将 LANG(或 LANGUAGE)设置为具有 UTF 编码的区域设置,并设置 LC_COLLATE,正如我们的瑞典朋友建议的那样。

$ ll -a
drwxr-xr-x+ 1 0K 2013-07-23 12:50 .
drwxr-xr-x  1 0K 2013-07-23 12:48 ..
-rw-r--r--  1 0K 2013-07-23 12:50 ?▒???▒??好?▒??谢?谢

$ LANG=en_US.utf-8
$ LC_COLLATE=C    

$ ll -a
drwxr-xr-x+ 1 0K 2013-07-23 12:50 .
drwxr-xr-x  1 0K 2013-07-23 12:48 ..
-rw-r--r--  1 0K 2013-07-23 12:50 我很好,谢谢

更新: 根据评论中的要求创建了三个文件夹。

薄荷味

作为本机 Windows 二进制文件启动。

薄荷味

URxvt

从笔记本电脑启动,在 Cygwin 中的 Xwin 下显示。请注意,当设置了 LC_COLLATE 时,文件会“正确”排序。

乌尔希

虚拟机中的 Ubuntu 虚拟控制台

风险投资

答案2

语言环境C不支持 UTF-8。如果您使用支持 UTF-8 的语言环境并设置了正确的排序规则,则调用ls应该会按预期进行。(如果您发现自己经常这样做,则可以构建自己的语言环境。有关引入其他语言环境部分内容的语言环境的示例,您可能需要查找英文

如果你只想种类根据 C 语言环境,你不需要设置 LC_ALL(这是一个全局覆盖对于所有其他 LC_* 设置,因此得名),但可以简单地设置LC_COLLATE,影响排序(链接是针对 AIX 的,但总体描述足够通用)。在这种情况下,LC_COLLATE=C ls -al应该足够接近您想要的。

相关内容