¿Cómo puedo hacer que el ls
comando 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, ls
el 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
, ls
se ordenará de forma similar a OS X.
LC_COLLATE
está configurado en_US.UTF-8
en OS X, pero ls
aún se ordena de la POSIX
manera anterior. ¿Alguien sabe cómo puedo hacer que esto se comporte más como Linux?
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
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
ls
y sort
de 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é:
Descargue e instale MacPorts:
Instale el paquete GNU Coreutils:
sudo port install coreutils
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 -U
opció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).
Agregue este alias en su .bash_profile
para que el normal ls
funcione 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 -U
opció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.
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.)
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.
coreutils
y 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.
/usr/local/share/locale
para su definición personalizada, lo que man setlocale
indica que también se respeta, y de forma predeterminada parece contener solo LC_MESSAGES para varias configuraciones regionales.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.
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.
/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"
.bashrc
o .zshrc
:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
README
y dontreadme
. Normalmente ls
se mostrará README
primero. si entro alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
en el indicador y lo ls
vuelvo a hacer, aparecerá dontreadme
primeroUsando
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.
Correr:
$ type ls
Probablemente encontrará que su ls
comando tiene un alias.
ls is /bin/ls
. En OS X: ls is hashed (/bin/ls)
. De cualquier manera, incluso si llamo /bin/ls
directamente, todavía no se ordena de acuerdo con LC_COLLATE.ls
comando 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 ls
comando de GNU Fileutils con la opción --sort=extension
. (Puede instalar GNU Fileutils, por ejemplo, a través de macports).
graham perrin
SpinUp __ A Davis
sort
yls
también respeta LC_COLLATE, pero la definición de LC_COLLATE para locales comoen_US.UTF-8
es 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.