Selezione insensibile alle maiuscole / minuscole in Mac OSX

29

Come posso creare il comando ls nei file di ordinamento e nelle directory di Max OS X Lion, simili a come fa Ubuntu Linux (senza distinzione tra maiuscole e minuscole, le directory NON in cima, i file di punti NON in primo piano)? Idealmente mi piacerebbe farlo senza eseguire il piping di output su un altro comando come sort.

Ad esempio, voglio vedere:

foo
Foobar
MyStuff/
.stuff/
test.txt

invece di:

.stuff
Foobar
MyStuff/
foo
test.txt

In Linux, l'ordine di ordinamento ls è controllato dalle impostazioni locali del sistema, in particolare LC_COLLATE . Quando LC_COLLATE=en_US.UTF-8 , ls ordinerà elementi come voglio. Quando LC_COLLATE=C , ls ordinerà in modo simile a OS X.

LC_COLLATE è impostato su en_US.UTF-8 in OS X, ma ls ancora ordina il vecchio modo POSIX . Qualcuno sa come posso farlo comportarsi più come Linux?

    
posta Emil 13.10.2011 - 22:23
fonte

10 risposte

16

Potrebbe non essere possibile:

Taking a look at the source code for ls, it uses strcoll to sort the filenames, and so should respect LC_COLLATE.

Some postings online suggest that the locales in BSD (and Darwin/OS X) are somewhat broken compared to those in Linux. I wrote a quick sorting program of my own which explicitly set it's locale and tested it using both the en_US.UTF-8 and C locales on my machine (Mac OS 10.6.3) and a university machine (Linux, FC11?). While sorting works as expected on the linux machine, ("a B c" vs "B a c"), the mac always sorts them as "B a c".

Fonte: link

RISPOSTA ORIGINALE

Questo comando non ordina i file punto, ma mostra elenchi di directory aggiuntivi

ls -f1 

Mi sono avvicinato a questo:

.
..
.stuff
foo
Foobar
MyStuff
test.txt
    
risposta data 11.02.2013 - 20:07
fonte
6

So che è stata data una risposta, ma questo funziona meglio per me:

ls -f1 -alF -G

Elenca tutti i dettagli e li ordina ignorando case.

    
risposta data 25.02.2014 - 18:56
fonte
4

Aggiungendo a ciò che Mike ha scritto sopra, l'ho preso un po 'oltre e ho trovato un modo per definire le tue regole di confronto.

Le definizioni delle impostazioni locali si trovano in / usr / share / locale /. Ogni cartella è una locale e ha un file (o un collegamento) LC_COLLATE, che definisce quali simboli sono "uguali" (ad esempio, U, u e ü devono essere considerati uguali al momento dell'ordine). Puoi duplicare una directory e questo creerà una nuova definizione di locale:

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

Ora avremo una nuova localizzazione chiamata "en_GB.UTF-8-CI" ("CI" per la distinzione tra maiuscole e minuscole) ed è possibile utilizzare LC_COLLATE da lì.

Ora, per cambiare LC_COLLATE nella nuova locale è possibile scaricare le fonti locali da link , modifica quello più vicino a cosa vuoi ed esegui

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

e ora quando corri

$ LC_COLLATE=en_GB.UTF-8-CI ls

avrai l'ordinamento in base alle tue regole.

Sì, questo è quello che serve per rendere "ls" la distinzione tra maiuscole e minuscole.

    
risposta data 24.11.2014 - 14:24
fonte
3

Questo mi ha infastidito per un po 'ora, e alla fine l'ho risolto (heh). Dopo aver provato un sacco di suggerimenti che non hanno funzionato, ecco cosa ha fatto.

Se sei disposto ad installare MacPorts (o Homebrew o Fink), la versione GNU di ls fa esattamente quello che vuoi. Io uso MacPorts, me stesso, quindi questo è l'approccio che spiegherò:

  1. Scarica e installa MacPorts:

    link

  2. Installa il pacchetto GNU Coreutils:

    sudo port install coreutils

  3. Ora dovresti avere GNU ls: gls . Provalo in una directory che contiene elementi che iniziano con lettere maiuscole e minuscole:

    gls -U

    (L'opzione -U significa in realtà "unsorted", ma su OS X che ha l'effetto desiderato di renderla insensibile alle maiuscole / minuscole.)

  4. Aggiungi questo alias nella tua .bash_profile in modo che il normale ls funzioni come preferisci (mi piace l'output a colori, ma puoi ometterlo se vuoi, hai solo bisogno di -U ):

    alias ls='gls -U --color'

Nota che l'opzione -U probabilmente non funzionerà su altre piattaforme. In OS X, sembra sempre fare la cosa giusta (forse perché HFS + è effettivamente case-insensitive - "case-aware", tecnicamente), ma se lo provi su una macchina Linux, i risultati molto probabilmente non saranno ordinato affatto.

    
risposta data 19.02.2014 - 21:33
fonte
2

Come soluzione alternativa puoi utilizzare una funzione e un alias:

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

Questo produce un output ordinato in base a maiuscole e minuscole per il comando ls standard.

    
risposta data 21.12.2011 - 11:13
fonte
2

con

ls -f

funziona per me.

-f interrompe ufficialmente qualsiasi ordinamento, ma sembra che l'ordinamento originale HFS risulti chiaro, che è esattamente un tipo insensibile alle maiuscole e minuscole.

Suppongo che in realtà dipenda dal fatto che la tua HD sia sensibile alla distinzione tra maiuscole e minuscole, ma poiché il formato HFS case-INsensibile è l'impostazione predefinita per i dischi di sistema Mac OS X, questo dovrebbe funzionare per la maggior parte degli utenti.

    
risposta data 06.10.2014 - 17:08
fonte
0

Esegui:

$ type ls

Probabilmente troverai che il tuo comando ls è alias.

    
risposta data 13.10.2011 - 23:25
fonte
0

Se ti interessa principalmente l'ordinamento dei file punto, puoi ordinare per estensione : usa il comando ls da GNU Fileutils con l'opzione --sort=extension . (Puoi installare GNU Fileutils, ad es. Tramite macports.)

    
risposta data 21.12.2011 - 10:24
fonte
0

ls sta ordinando secondo LC_COLLATE, è solo che la maggior parte di tutti i file LC_COLLATE sono impostati per fare l'ordinamento case sensitive. link

Ce ne sono due che sono impostati per l'ordinamento senza distinzione tra maiuscole e minuscole: cs_CZ.ISO8859-2 e et_EE.ISO8859-15 et_EE.ISO8859.15 non ordina la "Z" come vorrebbe l'inglese. cs.CZ.ISO8859-15 fa un buon lavoro con l'alfabeto, vorrei solo che ordinasse "~" prima dei caratteri alfabetici.

La mia soluzione è: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Mi chiedo se è possibile creare un file LC_COLLATE personalizzato per gestire "." il modo in cui vuoi e "~" nel modo in cui voglio.

    
risposta data 29.07.2014 - 05:57
fonte
0

Ispirato alla risposta di Mike, ho aggiunto quanto segue a / etc / bashrc, e funziona magnificamente in Mojave. Elenca i file nascosti alla fine quando viene aggiunto -a, ma questo non mi infastidisce.

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

È possibile visualizzare la nuova configurazione eseguendo il comando locale. Per ripristinare, basta rimuovere la riga da / etc / bashrc e accedere nuovamente al terminale.

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

Nota che né ls -f1 né ls -f hanno funzionato per me in Mojave. Ho finito con una lista veramente non ordinata. Solo la soluzione che ho fornito ha funzionato per me a Mojave.

    
risposta data 07.12.2018 - 06:19
fonte

Leggi altre domande sui tag