¿Cómo puedo hacer que "ls" muestre los archivos de puntos primero?

46

En algún momento del camino, arruiné mi comando ls y ahora recibo este pedido cuando lo ejecuto

$ ls -AhHl --color=auto
-rwxr-xr-x 1 clang clang  640 Mar  1 02:46 apple-touch-icon-precomposed.png
-rwxr-xr-x 1 clang clang  784 Jul 12 02:54 crossdomain.xml
-rwxr-xr-x 1 clang clang 1.2K Mar  1 02:46 favicon.ico
drwxr-xr-x 8 clang clang 4.0K Jul 12 23:50 .git
-rw-r--r-- 1 clang clang   17 Feb 29 19:48 .gitignore
-rwxr-xr-x 1 clang clang 1.4K Jul 12 02:54 humans.txt

¿Qué hice que hizo que ls ignorara los archivos de puntos y ordenara por primera letra?

Salida de locale:

$ locale
LANG=
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
clang1234
fuente

Respuestas:

47

Intenta agregar

export LC_COLLATE="C"

en sus archivos de puntos, o cambiando la LC_ALLasignación a:

export LC_ALL="C"

Esto controla la forma en que funciona la ordenación a nivel de personaje; aunque lo predeterminado sería ordenar los archivos de puntos en línea, esto hará que la sortlista de archivos de puntos primero.

Sin embargo, tenga en cuenta que esto básicamente detendrá el soporte para su ubicación real en todas las utilidades con reconocimiento local.


Para ir más allá, citando el manual de GNU Coreutils (el énfasis es mío):

Si usa un entorno local que no sea POSIX (por ejemplo, al establecerlo LC_ALLen en_US), la ordenación puede producir resultados que se ordenan de manera diferente a la que está acostumbrado.

En ese caso, establezca la LC_ALLvariable de entorno en C. Tenga en cuenta que la configuración solo LC_COLLATEtiene dos problemas. Primero, no es efectivo si LC_ALLtambién está configurado. En segundo lugar, tiene un comportamiento indefinido si LC_CTYPE(o LANG, si no LC_CTYPEestá configurado) se establece en un valor incompatible. Por ejemplo, obtienes un comportamiento indefinido si LC_CTYPEes ja_JP.PCKpero LC_COLLATEes en_US.UTF-8.

slhck
fuente
2
¡Establecer LC_ALL = "C" hizo el truco! Gracias por la rápida respuesta
clang1234
8
La configuración de LC_ALL = "C" hará que lslos nombres de archivo Unicode en idiomas extranjeros (p. Ej., Japonés) sean????????
ohho
Tenga en cuenta que al agregar export LC_ALL="C"a sus archivos de puntos, perderá efectivamente el soporte para su ubicación real en todas las utilidades compatibles con la ubicación. Si bien el problema de impresión que @ohho señala podría remediarse con la respuesta de Faroul , presentará problemas de clasificación : la clasificación solo se realizará por valor de byte, lo que dará como resultado una clasificación que (a) distingue entre mayúsculas y minúsculas inesperadamente , y (b) invariablemente coloca caracteres acentuados. después de todos los no acentuados.
mklement0
35

Para evitar cambios en todo el sistema sin una necesidad real, solo se puede cambiar la forma en que lsfunciona para el usuario actual agregando el alias a .bashrc:

alias ll='LC_COLLATE=C ls -alF'

Esto clasifica primero los archivos de puntos, permite manejar (mostrar y ordenar) adecuadamente los conjuntos de caracteres "poco comunes" como cirílico. El único culpable de que la clasificación distinga entre mayúsculas y minúsculas.

Fuente: http://ubuntuforums.org/showthread.php?t=816753

Andrey Loskutov
fuente
3
Esta es la mejor respuesta aquí con diferencia
ingeniero Dollery el
Hermosa. Mucho mejor que cambiar la configuración de todo el sistema (que puede causar problemas con algunos módulos de Python).
Gui Ambros
1
Esta fue la respuesta más útil. Además, en un entorno donde LC_ALLya está configurado en algo incompatible con ordenar / elevar archivos de puntos a la parte superior de la lslista, use alias ll='LC_ALL=C ls -alF'en su lugar, porque LC_COLLATEno se anula LC_ALL.
matty
8

Ajuste

LC_ALL="C.UTF-8"

funciona bien para mí: las diéresis y "ls -la" enumeran los archivos de puntos primero.

Faroul
fuente
3
los archivos de puntos se enumeran primero, pero ahora los nombres de archivo que comienzan con una letra mayúscula se enumeran antes que los que comienzan con una letra minúscula.
Chnossos
1
+1 por acercarse a la respuesta aceptada, pero para resumir las limitaciones: la clasificación se distingue entre mayúsculas y minúsculas , y los caracteres extranjeros, aunque ahora se imprimen correctamente debido a UTF-8, no se ordenarán correctamente.
mklement0
3
C.UTF-8es una configuración regional no válida, por lo que la configuración regional vuelve a C. Todavía pierde el soporte UTF-8. De hecho, es aún peor ya que la LC_ALL=Cmayoría de los programas muestran la mayoría de los caracteres multibyte correctamente , pero con LC_ALL=something_invalidalgunos programas no (como `ls).
Martin Tournoij
@MartinTournoij, pero si Stéphane Chazelas dice lo contrario sobre los sistemas GNU (por lo que probablemente Debian y Linux en general), ¿cuál es la correcta?
muru
@muru No estoy seguro, ¿supongo que tendrás que preguntarle a Stéphane? Todo lo que sé es que localeparece haber un error con LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 , eso está en Arch Linux.
Martin Tournoij
4

La página de manual de ls (1) enumera:

-v tipo natural de (versión) números dentro del texto

Esto parece cambiar la forma en que se ordenan los períodos y agrupa los archivos de puntos primero. Yo tengo:

alias ls='ls -vAF'
alias ll='ls -l'

en mi ~ / .bashrc.

Vince Valenti
fuente
1

Una idea descabellada

Descargo de responsabilidad: Esto será excesivo para la mayoría de ustedes. Pero he estado haciendo esto desde 1995 y tengo las habilidades para hacer que mi mundo sea exactamente como lo quiero. Entonces, ¿por qué no?

Realmente me gusta usar diferentes métodos de clasificación ls, especialmente -rt(que está rordenado por time siempre modificado ). Entonces, decidí probar algo loco y usar awk para hacer mi clasificación.

# save as ~/.ls.awk
# inpsired by http://superuser.com/questions/448291/how-can-i-make-ls-show-dotfiles-first

{
    if($1 == "total"){
        print $0
        next
    }
    # may need to adjust $9 to match your name column
    if(match($9, /^(\033\[[0-9]*m)*\./)) # optionally look past xterm highlighting like: ^[[34m
        df[++dd] = $0
    else
        nf[++nn] = $0
}
END{
    while (++d in df)
        print df[d]
    while (++n in nf)
        print nf[n]
}

Ahora, en lugar de definir un alias bash, defino una función bash (porque los alias solo pueden agregar argumentos al final, pero las funciones pueden usarlos en cualquier lugar)

ll(){ CLICOLOR_FORCE=1 ls -lhA $* | awk -f ~/.ls.awk; }

Para ver los resultados

Creemos algunos archivos de muestra:

for n in 4 .4 3 .3 2 .2 1 .1; do touch $n; sleep 1; done

Usando ls simple

$ ls -lA
total 8
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
$ ls -lArt

total 8
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1

Usando mi función que filtra con awk

$ ll
total 8
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4

$ ll -rt
total 8
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1

Puedes ver mi implementación de esto aquí https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

Lo más importante de esto es que es un marco para ajustar su lssalida. Puedes hacer lo que quieras con ese filtro awk. Es posible que desee que sean directorios, luego archivos de puntos, luego todo lo demás. Una vez que sepa cómo manejar sus colores xterm, no es demasiado difícil. Depende totalmente de usted.

Bruno Bronosky
fuente
-1

Podría intentar esto en su archivo .bashrc o / etc / bashrc:

LS_OPTIONS='--color=tty -A -F -X -B -h -v -b -T 0 --group-directories-first';
export LS_OPTIONS;
alias ls='/bin/ls $LS_OPTIONS';

Esto supone que está ejecutando una versión algo más nueva de ls que toma "--group-directorios-primero" como una opción. Obviamente, puede ajustar las opciones de LS a su gusto.

Phil
fuente
¿Qué --group-directories-firsttiene que ver con "mostrar los archivos de puntos primero"?
G-Man dice 'reinstalar a Monica' el