Como posso fazer com que “ls” apresente primeiro os arquivos de ponto e preserve os nomes de arquivos unicode?

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 你好嗎

Quando eu altero LC_ALL para C , os arquivos de pontos são listados primeiro, por nomes de arquivos unicode são ilegíveis:

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

Como posso fazer o "ls" mostrar os dotfiles primeiro e preservar nomes de arquivos unicode?

UPDATE, solução encontrada (graças à resposta de рослав Рахматуллин):

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

reiniciado, mostre 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

classificação conforme o esperado:

$ 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 你好嗎

sem aviso de 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.
    
por ohho 23.07.2013 / 10:37

2 respostas

0

oh, sua suposição parece incorreta. Ou seja, posso listar arquivos chineses mesmo sem 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 ?▒???▒??好?▒??谢?谢

Para alcançar seu objetivo, você deseja definir LANG (ou LANGUAGE) para uma localidade com uma codificação UTF e definir LC_COLLATE como sugerido por nosso amigo sueco.

$ 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 我很好,谢谢

atualização: Criou três pastas conforme o pedido no comentário.

Mintty

Lançado como um binário nativo do Windows.

URxvt

Lançadodolaptop,exibidonoXwinnoCygwin.Observequeosarquivossãoclassificados"corretamente" quando LC_COLLATE está definido.

ConsolevirtualdoUbuntuemumaVM

    
por 23.07.2013 / 13:03
5

A localidade C não faz UTF-8. Se você usar um código de idioma com reconhecimento de UTF-8 com as configurações de agrupamento adequadas, a invocação de ls deverá se comportar conforme o esperado. (Você pode construir sua própria localidade, se você estiver fazendo esse tipo de coisa com frequência. Para ver um exemplo de uma localidade que traz partes de outras localidades, você pode pesquisar en_SE .)

Se você apenas quiser classificar de acordo com a localidade C, não será necessário definir LC_ALL (que é um substituição global para todas as outras configurações LC_ *, daí o nome) mas pode simplesmente definir LC_COLLATE, que afeta a classificação (o link é para o AIX, mas a descrição geral é geral o suficiente). Nesse caso, LC_COLLATE=C ls -al deve estar perto o suficiente do que você deseja.

    
por 23.07.2013 / 11:11