Classificação sem diferenciação de maiúsculas e minúsculas no Mac OSX

30

Como posso fazer o lscomando no Max OS X Lion classificar arquivos e diretórios semelhantes ao Ubuntu Linux (sem distinção entre maiúsculas e minúsculas, diretórios NÃO na parte superior, arquivos de ponto NÃO na parte superior)? Idealmente, eu gostaria de fazer isso sem canalizar a saída para outro comando como classificar.

Por exemplo, eu quero ver:

foo
Foobar
MyStuff/
.stuff/
test.txt

ao invés de:

.stuff
Foobar
MyStuff/
foo
test.txt

No Linux, a lsordem de classificação é controlada pelo código do idioma do sistema, especificamente LC_COLLATE. Quando LC_COLLATE=en_US.UTF-8, ls classificará os itens como eu quiser. Quando LC_COLLATE=C, lsserá semelhante ao OS X.

LC_COLLATEestá definido en_US.UTF-8no OS X, mas lsainda classifica da POSIXmaneira antiga . Alguém sabe como eu posso fazer isso se comportar mais como o Linux?

Emil
fonte
Se ajudar: apple.stackexchange.com/a/22304/8546 observa que o HFS Plus geralmente é configurado para não diferenciar maiúsculas de minúsculas, mas preservar maiúsculas e minúsculas .
Graham Perrin

Respostas:

16

Pode não ser possível:

Examinando o código-fonte para ls , ele usa strcoll para classificar os nomes de arquivos e, portanto, deve respeitar LC_COLLATE.

Algumas postagens online sugerem que os locais no BSD (e no Darwin / OS X) estão um pouco danificados em comparação aos do Linux. Escrevi meu próprio programa de classificação rápida, que definiu explicitamente seu local e o testei usando os locais en_US.UTF-8 e C em minha máquina (Mac OS 10.6.3) e uma máquina universitária (Linux, FC11?). Enquanto a classificação funciona como esperado na máquina linux ("a B c" vs "B a c"), o mac sempre os classifica como "B a c".

Fonte: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

RESPOSTA ORIGINAL

Este comando não classifica arquivos de ponto, mas mostra listagens de diretório adicionais

ls -f1 

Cheguei perto disso:

.
..
.stuff
foo
Foobar
MyStuff
test.txt
Sairam
fonte
1
Interessante que "desabilitar classificação" com a opção -f realmente parece classificá-la conforme o esperado. Presumo que este seja o sistema de arquivos / HFS + que classifica as entradas com um agrupamento mais "natural".
Gerry
6

Eu sei que isso foi respondido, mas esse trabalho é melhor para mim:

ls -f1 -alF -G

Ele lista todos os detalhes e os classifica ignorando maiúsculas e minúsculas.

Jared Burrows
fonte
4

Isso já está me incomodando há um tempo, e finalmente resolvi (heh). Depois de tentar várias sugestões que não funcionaram, aqui está o que funcionou.

Se você deseja instalar o MacPorts (ou Homebrew, ou Fink), a versão GNU do ls faz exatamente o que você deseja. Eu mesmo uso o MacPorts, então essa é a abordagem que vou explicar:

  1. Baixe e instale o MacPorts:

    http://www.macports.org

  2. Instale o pacote GNU Coreutils:

    sudo port install coreutils

  3. Agora você deve ter ls GNU: gls. Experimente em um diretório que contém itens que começam com letras maiúsculas e minúsculas:

    gls -U

    (A -Uopção realmente significa "não classificado", mas no OS X tem o efeito desejado de torná-lo sem distinção entre maiúsculas e minúsculas.)

  4. Adicione esse alias no seu .bash_profilepara que o regular lsfuncione da maneira que você deseja (eu gosto da saída de cores, mas você pode omitir isso se quiser; você só precisa do -U):

    alias ls='gls -U --color'

Observe que a -Uopção provavelmente não funcionará em outras plataformas. No OS X, sempre parece fazer a coisa certa (talvez porque o HFS + não faça distinção entre maiúsculas e minúsculas - tecnicamente), mas se você tentar em uma caixa Linux, os resultados provavelmente não serão ordenado em tudo.

Jason Sims
fonte
1
3. parece não ter mais o efeito colateral desejado (opção -U) no macOS> = 10.13 devido ao novo APFS.
Marius Hofert 11/11
1
Sim ... parece que não há maneira de fazer isso com o APFS.
Jason Sims
Confirme se funciona na 10.12. Obrigado!
Coronel Panic
4

Além do que Mike escreveu acima, eu levei um pouco mais longe e encontrei uma maneira de definir suas próprias regras de agrupamento.

As definições de localidade estão localizadas em / usr / share / locale /. Cada pasta é um código de idioma e possui um arquivo (ou um link) LC_COLLATE, que define quais símbolos são "iguais" (por exemplo, U, u e ü devem ser considerados os mesmos ao fazer o pedido). Você pode duplicar um diretório e isso criará uma nova definição de localidade:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

Agora você terá um novo código de idioma chamado 'en_GB.UTF-8-CI' ('CI' para não diferenciar maiúsculas de minúsculas) e poderá usar LC_COLLATE a partir daí.

Agora, para alterar LC_COLLATE no novo código do idioma, você pode fazer o download das fontes de código do idioma em http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ , edite o código mais próximo do que você deseja e executa

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

e agora quando você corre

$ LC_COLLATE=en_GB.UTF-8-CI ls

você terá a classificação de acordo com suas regras.

Sim, é isso que é necessário para tornar 'ls' sem distinção entre maiúsculas e minúsculas.

Dmitry
fonte
2

Como solução alternativa, você pode usar uma função e um alias:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

Isso produz uma saída classificada sem distinção entre maiúsculas e minúsculas para o comando ls padrão.

Arne
fonte
1
Eu tenho que observar: isso falhará se, por exemplo, -l for usado. Então ls produz outra linha "X total" no início, que também será classificada.
Arne #
2

Usando

ls -f

funciona para mim.

-f desativa oficialmente qualquer classificação, mas parece que a classificação original do HFS brilha, o que é exatamente uma classificação que não diferencia maiúsculas de minúsculas.

Eu acho que depende realmente de você ter ou não seu formato HD sensível a maiúsculas e minúsculas, mas como o formato HFS sensível a maiúsculas e minúsculas é o padrão para os discos do sistema Mac OS X, isso deve funcionar para a maioria dos usuários.

Jpsy
fonte
Esta é definitivamente a resposta certa. O único problema é que ele também ativa implicitamente -a, e não há como desativá-lo, o que mostrará arquivos / pastas que começam com um período, inclusive. e ...
lensovet
1
O outro problema (agora) é que isso parece não funcionar mais no macOS> = 10.13 devido ao novo APFS.
Marius Hofert 11/11
1

Inspirado pela resposta de Mike, adicionei o seguinte ao / etc / bashrc, e ele funciona muito bem no Mojave. Ele lista os arquivos ocultos no final quando -a é adicionado, mas isso não me incomoda.

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

Você pode ver a nova configuração executando o comando locale. Para reverter, basta remover a linha do / etc / bashrc e efetuar login novamente no terminal.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Observe que nem ls -f1 nem ls -f funcionaram para mim no Mojave. Acabei com uma lista verdadeiramente não classificada. Somente a solução que forneci funcionou para mim no Mojave.

Jer
fonte
A melhor resposta, mas o exemplo dado faz muito. Ele deve ser aparado para: colocar a seguinte linha no seu .bashrcou .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489 22/11
0

Corre:

$ type ls

Você provavelmente descobrirá que seu lscomando está com alias.

MikeyB
fonte
No Linux: ls is /bin/ls. No OS X: ls is hashed (/bin/ls). De qualquer forma, mesmo se eu ligar /bin/lsdiretamente, ele ainda não será classificado de acordo com LC_COLLATE.
2
Isso é surpreendente, eu teria apostado que seu lscomando tinha um alias para incluir --group-directories-first. Ainda pode ser feito em outro lugar, apenas não um pseudônimo.
11558 MikeyB
0

Se você está preocupado principalmente com a ordem de classificação dos arquivos de pontos, você pode classificar por extensão : Use o lscomando do GNU Fileutils com a opção --sort=extension. (Você pode instalar o GNU Fileutils, por exemplo, através de macports.)

halloleo
fonte
0

ls está classificando de acordo com LC_COLLATE, mas a maioria dos arquivos LC_COLLATE está configurada para fazer a distinção entre maiúsculas e minúsculas. http://collation-charts.org/fbsd54/

Existem dois que estão definidos para classificação sem distinção entre maiúsculas e minúsculas: cs_CZ.ISO8859-2 e et_EE.ISO8859-15 et_EE.ISO8859.15 não classifica "Z" da maneira que os falantes de inglês gostariam. cs.CZ.ISO8859-15 faz um bom trabalho com o alfabeto, eu gostaria que ele classificasse "~" antes dos caracteres alfabéticos.

Minha solução é: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Gostaria de saber se um arquivo LC_COLLATE personalizado pode ser criado para manipular "." do jeito que você quer e "~" do jeito que eu quero.

Mike
fonte