Ordinamento senza distinzione tra maiuscole e minuscole in Mac OSX


30

Come posso rendere il lscomando in Max OS X Lion ordinare i file e le directory in modo simile a come fa Ubuntu Linux (senza distinzione tra maiuscole e minuscole, directory NON in cima, file dot NON in cima)? Idealmente, vorrei farlo senza eseguire il piping dell'output a 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' lsordinamento è controllato dalle impostazioni internazionali del sistema, in particolare LC_COLLATE. Quando LC_COLLATE=en_US.UTF-8ordinerò gli oggetti come voglio io. Quando LC_COLLATE=C, lsordinerà in modo simile a OS X.

LC_COLLATEè impostato su en_US.UTF-8OS X, ma lsordina ancora alla vecchia POSIXmaniera. Qualcuno sa come posso farlo comportare più come Linux?


Se aiuta: apple.stackexchange.com/a/22304/8546 osserva che HFS Plus è di solito configurato per non distinguere tra maiuscole e minuscole, ma preservare la custodia .
Graham Perrin,

Risposte:


16

Potrebbe non essere possibile:

Dando un'occhiata al codice sorgente per ls , usa strcoll per ordinare i nomi dei file, quindi dovrebbe rispettare LC_COLLATE.

Alcune pubblicazioni online suggeriscono che le versioni locali in BSD (e Darwin / OS X) sono in qualche modo interrotte rispetto a quelle in Linux. Ho scritto un mio programma di smistamento rapido che imposta esplicitamente le impostazioni locali e le ho testate utilizzando sia le versioni en_US.UTF-8 e C sulla mia macchina (Mac OS 10.6.3) sia una macchina universitaria (Linux, FC11?). Mentre l'ordinamento funziona come previsto sulla macchina Linux, ("a B c" vs "B a c"), il mac li ordina sempre come "B a c".

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

RISPOSTA ORIGINALE

Questo comando non ordina i file di punti, ma mostra ulteriori elenchi di directory

ls -f1 

Mi sono avvicinato a questo:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
È interessante notare che "disabilitare l'ordinamento" con l'opzione -f sembra effettivamente ordinarlo come previsto. Presumo che questo sia il filesystem / HFS + voci di ordinamento con regole di confronto più "naturali".
Gerry,

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 il caso.


4

Questo mi sta infastidendo da un po 'di tempo e finalmente l'ho risolto (eh). Dopo aver provato alcuni suggerimenti che non hanno funzionato, ecco cosa ha funzionato.

Se sei disposto a installare MacPorts (o Homebrew o Fink), la versione GNU di ls fa esattamente quello che vuoi. Uso i MacPort, quindi, questo è l'approccio che spiegherò:

  1. Scarica e installa MacPorts:

    http://www.macports.org

  2. Installa il pacchetto GNU Coreutils:

    sudo port install coreutils

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

    gls -U

    (L' -Uopzione in realtà significa "non ordinata", ma su OS X ha l'effetto desiderato di renderla insensibile alle maiuscole.)

  4. Aggiungi questo alias in .bash_profilemodo che il normale lsfunzioni nel modo desiderato (mi piace l'output a colori, ma puoi ometterlo se vuoi; hai solo bisogno del -U):

    alias ls='gls -U --color'

Nota che -Uprobabilmente l' opzione non funzionerà su altre piattaforme. In OS X, sembra sempre fare la cosa giusta (forse perché HFS + è effettivamente insensibile al maiuscolo / minuscolo, tecnicamente), ma se lo provi su un box Linux, molto probabilmente i risultati non saranno risolto a tutti.


1
3. non sembra più avere l'effetto collaterale desiderato (opzione -U) in macOS> = 10.13 a causa del nuovo APFS.
Marius Hofert,

1
Sì ... non sembra che ci sia modo di farlo con APFS.
Jason Sims il

Conferma però funziona su 10.12. Grazie!
Colonnello Panic,

4

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

Le definizioni delle impostazioni internazionali 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 avrai una nuova locale chiamata 'en_GB.UTF-8-CI' ('CI' per la distinzione tra maiuscole e minuscole) e puoi usare LC_COLLATE da lì.

Ora, per cambiare LC_COLLATE nel nuovo locale è possibile scaricare i sorgenti del locale da http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ , modificare quello è il più vicino a ciò che vuoi ed eseguire

$ 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 secondo le tue regole.

Sì, questo è ciò che serve per rendere 'ls' una distinzione tra maiuscole e minuscole.


2

Per ovviare al problema, puoi utilizzare una funzione e un alias:

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

Questo produce un output ordinato in modo insensibile al caso per il comando ls standard.


1
Devo notare: questo fallirà se per esempio viene usato -l. Quindi all'inizio produce un'altra riga "X totale", che verrà anche ordinata.
Arne,

2

utilizzando

ls -f

per me va bene.

-f disattiva ufficialmente qualsiasi ordinamento, ma sembra che l'ordinamento HFS originale traspare, che è esattamente un ordinamento senza distinzione tra maiuscole e minuscole.

Immagino, in realtà dipende dal fatto che tu abbia il tuo HD formattato con distinzione tra maiuscole e minuscole o meno, ma poiché il formato HFS sensibile al maiuscolo / minuscolo è l'impostazione predefinita per i dischi di sistema di Mac OS X, questo dovrebbe funzionare per la maggior parte degli utenti.


Questa è sicuramente la risposta giusta. L'unico problema è che si accende implicitamente anche -a, e non c'è modo di disattivarlo, che ti mostrerà file / cartelle che iniziano con un punto, incluso. e .. .
lensovet,

1
L'altro problema (ora) è che questo non sembra funzionare più in macOS> = 10.13 a causa del nuovo APFS.
Marius Hofert,

1

Ispirato dalla 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 ciò non mi disturba.

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

Puoi vedere la nuova configurazione eseguendo il comando locale. Per ripristinare, basta rimuovere la linea 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 un elenco davvero non ordinato. Solo la soluzione che ho fornito ha funzionato per me in Mojave.


La risposta migliore, ma l'esempio fornito fa troppo. Dovrebbe essere ridotto a: inserisci la seguente riga nel tuo .bashrco .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489

0

Correre:

$ type ls

Probabilmente scoprirai che il tuo lscomando è alias.


Su Linux: ls is /bin/ls. Su OS X: ls is hashed (/bin/ls). In entrambi i casi, anche se chiamo /bin/lsdirettamente, non ordina ancora in base a LC_COLLATE.

2
È sorprendente, avrei scommesso che il tuo lscomando fosse stato modificato per includerlo --group-directories-first. Potrebbe ancora essere fatto da qualche altra parte, non solo un alias.
MikeyB,

0

Se ti preoccupi principalmente dell'ordinamento dei file dot, puoi ordinarli per estensione : Usa il lscomando dal GNU Fileutils con l'opzione --sort=extension. (È possibile installare i GNU Fileutils ad es. Tramite macports.)


0

Sta ordinando secondo LC_COLLATE, è solo che la maggior parte dei file LC_COLLATE sono impostati per eseguire l'ordinamento con distinzione tra maiuscole e minuscole. http://collation-charts.org/fbsd54/

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 "Z" nel modo in cui vorrebbero gli inglesi. 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 sia possibile creare un file LC_COLLATE personalizzato per gestire "." nel modo desiderato e "~" nel modo desiderato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.