Como eu faço ls caracteres sublinhados primeiro?

16

Eu gosto de poder nomear arquivos e diretórios com um prefixo de sublinhado se é algo que eu quero manter separado de outros arquivos e diretórios no mesmo nível. No Windows e no Mac, por exemplo, o prefixo de um arquivo com um sublinhado o classifica na parte superior, na frente dos arquivos que começam com um caractere alfanumérico.

Meu google descobriu que tem a ver com o LC_COLLATE e meu local atual (en_US). Tudo bem, embora eu realmente não entenda por que en_US não classifica como esperado.

Com base no site de demonstração do Agrupamento de UTI definir localidade para en_US_POSIX certamente parece ter a ordem de classificação que estou procurando (você precisa editar os dados de amostra e adicionar alguns sublinhados para testá-los). Mas eu realmente não vejo como aplicar isso no meu shell Linux.

Idealmente, gostaria de poder configurar algo na minha configuração do bash para que sempre classifique primeiro os sublinhados. Como eu faria isso?

    
por Tom Auger 01.06.2012 / 19:19

4 respostas

5

Se você não puder obter ls para ordenar da maneira que quiser, tente a expansão do shell.

Você pode usar padrões de nome de arquivo para executar ls com uma lista de arquivos que o shell já classificou, ignorando o método que ls usa.

ls -lf _* [!_]*

Supondo que você tenha os arquivos

_a a _b b _c c

isto é como correr

ls -lf _a _b _c a b c

Explicação:

_* é um padrão de shell que corresponde a qualquer nome de arquivo que comece com um sublinhado, expandido em ordem alfabética.

[!_]* corresponde a qualquer nome de arquivo não começando com um sublinhado, expandido em ordem alfabética.

-f diz ls para não , porque o shell já o fez.

Mais informações: expansão do nome de arquivo bash

Se houver diretórios no diretório atual, você irá querer executar o comando como este para evitar ls listando arquivos nos diretórios:

ls -lfd _* [!_]*
    
por 01.06.2012 / 19:52
14

Se você não quiser misturar letras maiúsculas e minúsculas, defina sua localidade como C , que aceita caracteres em ordem numérica. _ cai entre maiúsculas e minúsculas.

$ LC_COLLATE=C ls    
BAR  FOO  _score  _under  hello  world
$ LC_COLLATE=en_US ls                    
BAR  FOO  hello  _score  _under  world

As configurações de localidade LC_MESSAGES (idioma das mensagens de erro), LC_CTYPE (conjuntos de caracteres) e LC_TIME (formato de data e hora) são muito úteis. LC_COLLATE e LC_NUMERIC são geralmente mais problemas do que valem, não é recomendável configurá-los. A classificação lexicográfica adequada é mais complicada do que o LC_COLLATE deve especificar, e pode causar todos os tipos de comportamentos estranhos quando você usa intervalos de caracteres em expressões regulares. LC_NUMERIC é principalmente cosmético, exceto quando algo dá errado, porque algum programa produziu um número com um separador decimal diferente de . .

    
por 02.06.2012 / 02:39
2
Infelizmente, o Linux usa o glibc para suas informações de código de idioma, não ICU, portanto, não há como aplicá-lo diretamente ao Linux sem gastar muito esforço, seja atualizando o ICU em glibc ou complementando as informações de localidade na glibc.

    
por 01.06.2012 / 19:28
-4

A adição da opção -f (sem classificação) fez com que mostrasse isso para mim.

man ls

[root@dusknoir ~/java/test]# ls -fl
total 0
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _1
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _2
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _3
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 1
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 2
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 3
    
por 01.06.2012 / 19:29

Tags