Ordenación sin distinción entre mayúsculas y minúsculas en Mac OSX


30

¿Cómo puedo hacer que el lscomando en Max OS X Lion clasifique los archivos y directorios de manera similar a como lo hace Ubuntu Linux (no distingue entre mayúsculas y minúsculas, los directorios NO están en la parte superior, los archivos de puntos NO están en la parte superior)? Idealmente, me gustaría hacer esto sin canalizar la salida a otro comando, como ordenar.

Por ejemplo, quiero ver:

foo
Foobar
MyStuff/
.stuff/
test.txt

en lugar de:

.stuff
Foobar
MyStuff/
foo
test.txt

En Linux, el lsorden de clasificación está controlado por la configuración regional del sistema, específicamente LC_COLLATE. Cuando LC_COLLATE=en_US.UTF-8, voy a ordenar los elementos como quiero. Cuando LC_COLLATE=C, lsse ordenará de manera similar a OS X.

LC_COLLATEestá configurado en_US.UTF-8en OS X, pero lsaún se ordena a la antigua POSIXusanza. ¿Alguien sabe cómo puedo hacer que esto se parezca más a Linux?


Si ayuda: apple.stackexchange.com/a/22304/8546 observa que HFS Plus generalmente está configurado para ser insensible a mayúsculas y minúsculas .
Graham Perrin

Respuestas:


16

Puede que no sea posible:

Echando un vistazo al código fuente de ls , utiliza strcoll para ordenar los nombres de archivo, por lo que debe respetar LC_COLLATE.

Algunas publicaciones en línea sugieren que las configuraciones regionales en BSD (y Darwin / OS X) están algo rotas en comparación con las de Linux. Escribí un programa de clasificación rápida propio que configuró explícitamente su configuración regional y lo probé utilizando las configuraciones regionales en_US.UTF-8 y C en mi máquina (Mac OS 10.6.3) y una máquina universitaria (Linux, FC11?). Si bien la ordenación funciona como se esperaba en la máquina Linux ("a B c" frente a "B a c"), la Mac siempre los clasifica como "B a c".

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

RESPUESTA ORIGINAL

Este comando no clasifica los archivos de puntos, pero muestra listados de directorios adicionales

ls -f1 

Me acerqué a esto:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
Es interesante que "deshabilitar la ordenación" con la opción -f realmente parezca ordenarlo como se esperaba. Supongo que este es el sistema de archivos / HFS + ordenando entradas con una clasificación más "natural".
Gerry

6

Sé que esto ha sido respondido, pero esto funciona mejor para mí:

ls -f1 -alF -G

Enumera todos los detalles y los ordena ignorando mayúsculas y minúsculas.


4

Esto me ha estado molestando por un tiempo ahora, y finalmente lo resolví (je). Después de probar un montón de sugerencias que no funcionaron, esto es lo que sí funcionó.

Si está dispuesto a instalar MacPorts (o Homebrew, o Fink), la versión GNU de ls hace exactamente lo que desea. Yo uso MacPorts, así que ese es el enfoque que explicaré:

  1. Descargue e instale MacPorts:

    http://www.macports.org

  2. Instale el paquete GNU Coreutils:

    sudo port install coreutils

  3. Ahora debe tener ls de GNU: gls. Pruébelo en un directorio que contiene elementos que comienzan con letras mayúsculas y minúsculas:

    gls -U

    (La -Uopción en realidad significa "sin clasificar", pero en OS X eso tiene el efecto deseado de hacer que no distinga entre mayúsculas y minúsculas).

  4. Agregue este alias en su .bash_profilepara que el regular lsfuncione de la manera que desea (me gusta la salida de color, pero puede omitir eso si lo desea; solo necesita el -U):

    alias ls='gls -U --color'

Tenga en cuenta que la -Uopción probablemente no funcionará en otras plataformas. En OS X, siempre parece hacer lo correcto (tal vez porque HFS + no distingue entre mayúsculas y minúsculas, técnicamente), pero si lo prueba en una caja de Linux, los resultados probablemente no sean ordenado en absoluto.


1
3. ya no parece tener el efecto secundario deseado (opción -U) en macOS> = 10.13 debido al nuevo APFS.
Marius Hofert

1
Sí ... no parece que haya ninguna manera de hacer esto con APFS.
Jason Sims

Confirmar si funciona en 10.12 sin embargo. ¡Gracias!
Coronel Panic

4

Además de lo que Mike escribió anteriormente, lo llevé un poco más lejos y encontré una manera de definir sus propias reglas de clasificación.

Las definiciones locales se encuentran en / usr / share / locale /. Cada carpeta es una configuración regional y tiene un archivo (o un enlace) LC_COLLATE, que define qué símbolos son "iguales" (por ejemplo, que U, u y ü deben considerarse iguales al realizar el pedido). Puede duplicar un directorio y esto creará una nueva definición de configuración regional:

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

Ahora tendrá una nueva configuración regional llamada 'en_GB.UTF-8-CI' ('CI' para mayúsculas y minúsculas) y puede usar LC_COLLATE desde allí.

Ahora, para cambiar LC_COLLATE en la nueva configuración regional, puede descargar las fuentes de configuración regional desde http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ , edite la eso es lo más cercano a lo que quieres y correr

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

y ahora cuando corres

$ LC_COLLATE=en_GB.UTF-8-CI ls

Tendrás que ordenar según tus reglas.

Sí, esto es lo que se necesita para hacer que 'ls' no distinga entre mayúsculas y minúsculas.


2

Como solución alternativa, puede usar una función y un alias:

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

Esto produce una salida ordenada sin distinción entre mayúsculas y minúsculas para el comando ls estándar.


1
Tengo que tener en cuenta: esto fallará si, por ejemplo, se usa -l. Entonces ls produce otra línea "total X" al principio, que también se ordenará.
Arne

2

Utilizando

ls -f

funciona para mi.

-f apaga oficialmente cualquier clasificación, pero parece que entonces se muestra la clasificación HFS original, que es exactamente una clasificación sin distinción entre mayúsculas y minúsculas.

Supongo que en realidad depende de si tiene o no su formato HD distingue entre mayúsculas y minúsculas, pero como el formato HFS sensible a mayúsculas y minúsculas es el predeterminado para los discos del sistema Mac OS X, esto debería funcionar para la mayoría de los usuarios.


Esta es definitivamente la respuesta correcta. El único problema es que también activa implícitamente -a, y no hay forma de desactivarlo, lo que le mostrará archivos / carpetas que comienzan con un punto, incluido. y ...
lensovet

1
El otro problema (ahora) es que esto ya no parece funcionar en macOS> = 10.13 debido al nuevo APFS.
Marius Hofert

1

Inspirado por la respuesta de Mike, agregué lo siguiente a / etc / bashrc, y funciona muy bien en Mojave. Enumera los archivos ocultos al final cuando se agrega -a, pero eso no me molesta.

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

Puede ver la nueva configuración ejecutando el comando locale. Para revertir, simplemente quite la línea de / etc / bashrc y vuelva a iniciar sesión en la 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=

Tenga en cuenta que ni ls -f1 ni ls -f funcionaron para mí en Mojave. Terminé con una lista realmente sin clasificar. Solo la solución que he proporcionado funcionó para mí en Mojave.


La mejor respuesta, pero el ejemplo dado hace demasiado. Debe recortarse para: poner la siguiente línea en su .bashrco .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489

0

Correr:

$ type ls

Probablemente encontrará que su lscomando tiene un alias.


En linux: ls is /bin/ls . En OS X: ls is hashed (/bin/ls). De cualquier manera, incluso si llamo /bin/lsdirectamente, todavía no se ordena de acuerdo con LC_COLLATE.

2
Eso es sorprendente, habría apostado que su ls comando tenía el alias para incluir --group-directories-first. Todavía se puede hacer en otro lugar, solo que no es un alias.
MikeyB

0

Si le preocupa principalmente el orden de los archivos de puntos, puede ordenarlos por extensión : use el lscomando de GNU Fileutils con la opción --sort=extension. (Puede instalar GNU Fileutils, por ejemplo, a través de macports).


0

ls está ordenando de acuerdo con LC_COLLATE, es solo que la mayoría de los archivos LC_COLLATE están configurados para ordenar con mayúsculas y minúsculas. http://collation-charts.org/fbsd54/

Hay dos que están configurados para la clasificación sin distinción entre mayúsculas y minúsculas: cs_CZ.ISO8859-2 y et_EE.ISO8859-15 et_EE.ISO8859.15 no clasifica "Z" de la manera en que los hablantes de inglés desearían. cs.CZ.ISO8859-15 hace un buen trabajo con el alfabeto, solo desearía que clasificara "~" antes de los caracteres alfabéticos.

Mi solución es: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Me pregunto si se podría hacer un archivo LC_COLLATE personalizado para manejar "". como quieres y "~" como yo quiero.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.