5
$ 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 , точечные файлы перечисляются первыми, по юникоду имена файлов не читаются:

$ 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» сначала показывал точечные файлы и сохранял имена файлов в юникоде?

ОБНОВЛЕНИЕ, решение найдено (спасибо ответу Ярослава Рахматуллина):

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

перезагрузил, покажи env:

$ 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.

2 ответа2

5

Локаль C не делает UTF-8. Если вы используете языковой стандарт с поддержкой UTF-8 с правильными настройками сортировки, то вызов ls должен вести себя так, как вы ожидаете. (Вы можете создать свою собственную локаль, если вы обнаружите, что часто делаете подобные вещи. В качестве примера локали, в которую входят части из других локалей, вы можете поискать en_SE.)

Если вы хотите сортировать только по языку C, вам не нужно устанавливать LC_ALL (который является глобальным переопределением для всех других настроек LC_ *, следовательно, имя), но вы можете просто установить LC_COLLATE, что влияет на сортировку (ссылка для AIX, но общее описание достаточно общее). В этом случае LC_COLLATE=C ls -al должно быть достаточно близко к тому, что вы хотите.

0

ооо, ваше предположение кажется неверным. То есть я могу перечислять китайские файлы даже без 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 我很好,谢谢

обновление: Создано три папки по запросу в комментарии.

Mintty

Запущен как родной Windows бинарный.

mintty

URxvt

Запускается с ноутбука, отображается под Xwin в Cygwin. Обратите внимание, что файлы отсортированы "правильно", когда установлен LC_COLLATE.

urxvt

Виртуальная консоль Ubuntu в виртуальной машине

VC

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .