O título é um resumo do que estou tentando alcançar, mas darei um exemplo para ilustrar qual é meu problema e como estou tentando resolvê-lo.
Pasta de exemplo
Digamos que eu tenha uma pasta em um sistema Linux com os seguintes arquivos: .a
, .A
, .b
, .B
, a
, A
, b
e B
.
Thunar
Quando abro a pasta no Thunar, meu gerenciador de arquivos preferido, os arquivos são exibidos nesta ordem:
.a
.A
.b
.B
a
A
b
B
Esta é uma saída que faz sentido para mim; primeiro os arquivos ocultos (ou diretórios), depois classificados alfabeticamente (onde o caso é levado em conta). De preferência, eu teria os arquivos em letras maiúsculas classificados antes dos em letras minúsculas, mas não é tão ruim. Em outras palavras, esta é a saída que estou tentando obter com ls
.
ls
Quando quero listar os arquivos desta pasta via ls
, isto é o que obtenho:
$ ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B
Aqui, os arquivos ocultos não são classificados no topo, mas os arquivos em geral são classificados em uma ordem alfabética "sensata".
Experimentando com LC_ALL=C
eLC_COLLATE=C
Algumas soluções para classificar os arquivos ocultos no topo são definir temporariamente LC_ALL
ou LC_COLLATE
como C
(estou com dificuldade para ver a diferença entre os dois, então uma explicação seria muito apreciada):
$ LC_ALL=C ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b
$ LC_COLLATE=C ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b
Como você pode ver, isso resolve o problema dos arquivos ocultos, mas o comportamento da classificação alfabética agora é inconsistente com a forma como o Thunar classifica os arquivos em ordem alfabética.
Questões
Então isso levanta a questão: como eu consigo ls
classificar da mesma forma que o Thunar? De preferência, eu quero evitar o pipe ls
para outro comando como sort
, já que eu gostaria de criar um alias para esse novo comando para "ls"
ele mesmo.
E se isso não for possível, como posso fazer o Thunar classificar os arquivos da maneira que ls
ele classificaria os arquivos (o método LC_ALL=C
/ LC_COLLATE=C
parece bom o suficiente para mim)?
Por extensão, gostaria de perguntar quais são as melhores práticas ao classificar arquivos em ordem alfabética. O comportamento que acabei de descrever é exatamente o que parece sensato para mim, mas talvez não seja, afinal?
Se estiver usando zsh, você pode definir uma função de ordem de classificação globbing para ser usada com o
o+funcname
qualificador glob , que coloca arquivos ocultos cujot
ail (nome base) começa com.
first with:Em seguida, para
print
os nomes dos arquivos no diretório de trabalho atualr
aw na1
C
coluna nessa ordem:(observe também o
D
qualificador otglob para que os dotfiles não sejam ignorados como aconteceria por padrão).Com a implementação GNU de
ls
, você pode desabilitar sua própria classificação com a opção-U
/--sort=none
:Se você preferir ter caracteres maiúsculos antes dos minúsculos, você pode usar uma ordem de intercalação dinamarquesa onde isso parece ser o caso:
Ou você pode alternar para o idioma C, que geralmente classifica com base no valor do byte e,
A-Z
no conjunto de caracteres ASCII, vem antes dea-z
.Para sua pergunta principal: A boa solução é provavelmente criar uma nova
LC_COLLATE
definição (o que pode ter que acontecer nals
função, pois alguém poderia chamá-la comLC_ALL=... ls -lA
...). Não tenho ideia de como fazer isso.Para a parte
LC_ALL=C
/LC_COLLATE=C
da questão: Normalmente não deve haver diferença. Haveria apenas uma seLC_ALL
tivesse sido definido para um valor diferente antes. Eles fazem a mesma coisa,LC_ALL=C
apenas afetam mais configurações e têm uma prioridade maior.