Clasificación ls que no distingue entre mayúsculas y minúsculas en Mac OSX

¿Cómo puedo hacer que el lscomando en Max OS X Lion ordene archivos y directorios de forma similar a como lo hace Ubuntu Linux (sin distinción entre mayúsculas y minúsculas, directorios NO en la parte superior, archivos de puntos NO 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 vez de:

.stuff
Foobar
MyStuff/
foo
test.txt

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

LC_COLLATEestá configurado en_US.UTF-8en OS X, pero lsaún se ordena de la POSIXmanera anterior. ¿Alguien sabe cómo puedo hacer que esto se comporte más como Linux?

Si ayuda: apple.stackexchange.com/a/22304/8546 observa que HFS Plus generalmente está configurado para no distinguir entre mayúsculas y minúsculas , pero conserva las mayúsculas y minúsculas .
Nota para Googlers: macOS sorty lstambién respeta LC_COLLATE, pero la definición de LC_COLLATE para locales como en_US.UTF-8es solo un enlace simbólico que hace que se comporte como C locale. Consulte la respuesta de Mike a continuación para obtener más detalles.

Respuestas (10)

Puede que no sea posible:

Echando un vistazo al código fuente de ls , utiliza strcoll para ordenar los nombres de los archivos, por lo que debería 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ápido propio que establecía explícitamente su configuración regional y lo probé usando 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 clasificación funciona como se esperaba en la máquina Linux ("a B c" frente a "B a c"), 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 ordena archivos de puntos, pero muestra listados de directorios adicionales

ls -f1 

Me acerqué a esto:

.
..
.stuff
foo
Foobar
MyStuff
test.txt
Es interesante que "deshabilitar el ordenamiento" con la opción -f en realidad parece ordenarlo como se esperaba. Supongo que este es el sistema de archivos/HFS+ clasificando las entradas con una intercalación más "natural".
Nota reciente de Googlers: lsy sortde hecho respetan LC_COLLATE, pero las definiciones de LC_COLLATE son diferentes en BSD/macOS en comparación con Linux. Ver la respuesta , que actualmente tiene muchos menos votos.

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

Si está dispuesto a instalar MacPorts (o Homebrew o Fink), la versión GNU de ls hace exactamente lo que desea. Yo mismo 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 debería tener GNU ls: gls. Pruébelo en un directorio que contenga elementos que comiencen con letras mayúsculas y minúsculas:

    gls -U

    (La -Uopción en realidad significa "sin ordenar", 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 normal lsfuncione de la manera que desee (me gusta la salida de color, pero puede omitirlo si lo desea; solo necesita el -U):

    alias ls='gls -U --color'

Tenga en cuenta que la -Uopción probablemente no funcione en otras plataformas. En OS X, siempre parece hacer lo correcto (tal vez porque HFS+ es efectivamente insensible a mayúsculas y minúsculas, "consciente de mayúsculas y minúsculas", técnicamente), pero si lo prueba en una caja de Linux, lo más probable es que los resultados simplemente no sean ordenado en absoluto.

3. parece que ya no tiene el efecto secundario deseado (opción -U) en macOS >= 10.13 debido al nuevo APFS.
Sí... no parece que haya forma de hacer esto con APFS.
Sin embargo, Confirm funciona en 10.12. ¡Gracias!

Actualización al 1 de agosto de 2021:

ls -alFG

Explicaciones:

-a      Include directory entries whose names begin with a dot (.).
-l      (The lowercase letter ``ell''.)  List in long format.  (See below.)  A total sum for all the file sizes is output on a line before the long
        listing.
-F      Display a slash (`/') immediately after each pathname that is a directory, an asterisk (`*') after each that is executable, an at sign (`@')
        after each symbolic link, an equals sign (`=') after each socket, a percent sign (`%') after each whiteout, and a vertical bar (`|') after
        each that is a FIFO.
-G      Enable colorized output.  This option is equivalent to defining CLICOLOR in the environment.  (See below.)

Antiguo:

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

ls -f1 -alFG

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

Esto ya no parece funcionar con macOS 11.4 (obtengo una lista verdaderamente desordenada que probablemente refleja el orden en el sistema de archivos).
@cbrnr ¿Por qué votar negativo? Escribí esta respuesta hace más de 7 años. Si tienes una sugerencia, sugiérela.
Voté negativamente porque su respuesta ya no funciona en macOS 11.4. Sin embargo, el título menciona específicamente OS X Lion, por lo que eliminé mi voto negativo porque aún podría funcionar allí. La mejor solución en 11.4 parece ser coreutilsy gls.

Agregando a la respuesta de Mike , lo llevé un poco más lejos y encontré una manera de definir sus propias reglas de intercalación.

Las definiciones de configuración regional 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 distinguir entre mayúsculas y minúsculas) y podrá usar LC_COLLATE desde allí.

Ahora, para cambiar LC_COLLATE en la nueva configuración regional, puede descargar las fuentes de la 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 corre

$ 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 clasificación de acuerdo a tus reglas.

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

tal vez considere usar /usr/local/share/localepara su definición personalizada, lo que man setlocaleindica que también se respeta, y de forma predeterminada parece contener solo LC_MESSAGES para varias configuraciones regionales.
@mmmmmm, ¿podría arreglar su edición? Introdujo un problema de gramática

Como solución, 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.

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

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

Hay dos que están configurados para una clasificación que no distingue 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 que querrían los angloparlantes. cs.CZ.ISO8859-15 hace un buen trabajo con el alfabeto, solo desearía que ordenara "~" 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 crear un archivo LC_COLLATE personalizado para manejar "." como tú quieras y "~" como yo quiero.

de hecho, si mira en /usr/share/locale, muchos archivos LC_COLLATE (por ejemplo, en_US.UTF-8) son un enlace simbólico a la_LN.US-ASCII, que ordena mayúsculas antes que minúsculas. cs_CZ.ISO8859-2 tiene su propio archivo LC_COLLATE.

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

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

Puede ver la nueva configuración ejecutando el comando locale. Para revertir, simplemente elimine 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 me funcionaron en Mojave. Terminé con una lista verdaderamente desordenada. Solo la solución que proporcioné funcionó para mí en Mojave.

ACTUALIZACIÓN: Según la sugerencia de user1561489 en los comentarios, tuve éxito con la siguiente línea más eficiente colocada en el archivo /etc/bashrc.

alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls -AlhF"
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, probé tu sugerencia, pero no funcionó para mí.
Lo acabo de volver a intentar y me funciona en Catalina. Intente crear un directorio temporal y coloque dos archivos en él: READMEy dontreadme. Normalmente lsse mostrará READMEprimero. si entro alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"en el indicador y lo lsvuelvo a hacer, aparecerá dontreadmeprimero
Tienes razón. Trabajó en Mojave. Puse lo siguiente en /etc/bashrc: alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls -AlhF". Agregué su sugerencia como una actualización de mi publicación, @ usuario1561489.
Es posible que desee crear un alias para el comando de clasificación de la misma manera, dependiendo de cuáles sean sus objetivos.

Usando

ls -f

funciona para mi.

-f desactiva oficialmente cualquier clasificación, pero parece que la clasificación HFS original brilla, que es exactamente una clasificación que no distingue entre mayúsculas y minúsculas.

Supongo que en realidad depende de si tiene su formato HD que distingue entre mayúsculas y minúsculas o no, pero como el formato HFS que distingue entre 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 con esto es que implícitamente también activa -a, y no hay forma de desactivarlo, lo que le mostrará archivos/carpetas que comienzan con un punto, incluido . y .. .
El otro problema (ahora) es que esto ya no parece funcionar en macOS >= 10.13 debido al nuevo APFS.

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.
Eso es sorprendente, hubiera apostado a que su lscomando tenía un alias para incluir --group-directories-first. Todavía se puede hacer en otro lugar, pero no un alias.

Si lo que más le preocupa es el orden de clasificación 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).