Cree los siguientes archivos en un directorio.
$ touch .a .b a b A B 你好嗎
Mi ls
orden predeterminada ignora la presencia de puntos iniciales, mezclándolos con los otros archivos.
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Yo puedo cambiar LC_COLLATE
a poner en primer lugar los dotfiles.
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Por desgracia, esto hace que el orden de clasificación entre mayúsculas y minúsculas, es decir, A
y B
preceden a
y b
. ¿Hay alguna manera de imprimir archivos de puntos primero sin dejar de distinguir entre mayúsculas A
y minúsculas ( y a
preceder B
y b
)?
Editar: intentando modificar LC_COLLATE
Ninguna de las respuestas hasta ahora replica completamente la funcionalidad de ls
fácilmente. Posiblemente, podría incluir algunos de ellos en una función, pero esto tendría que incluir un código detallado sobre (p. Ej.) Cómo trabajar sin argumento frente a proporcionar un directorio como argumento. O cómo lidiar con una -d
bandera explícita .
Alternativamente, pensé que tal vez podría haber una mejor LC_COLLATE
para usar. Sin embargo, parece que no puedo hacer que eso funcione. Actualmente estoy usando LC_COLLATE="en_AU.UTF-8"
. Lo comprobé /usr/share/i18n/locales/en_AU
(aunque no estoy seguro de si este es el archivo correcto, ya que no puedo ver ninguna referencia UTF-8
); Encontré lo siguiente.
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
contiene copy "iso14651_t1_common"
. Finalmente /usr/share/i18n/locales/iso14651_t1_common
contiene
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
Eliminé esta línea, corrí sudo locale-gen
y reinicié mi computadora. Lamentablemente, esto no cambió nada.
$@
.Se puede utilizar un orden de publicación de la cáscara en su lugar (que puede no implicar orden de clasificación de la configuración regional;
bash
, AT & Tksh
,yash
,tcsh
yzsh
dar los resultados esperados,mksh
ydash
. No lofish
parece dar una orden de mayúsculas y minúsculas, pero da resultados diferentes cuando hay no ASCII caracteres):Esto proporciona
ls
una lista explícita de archivos (y directorios) para enumerar, y desactivals
la ordenación (-U
que es una extensión de GNU).Hay algunas advertencias, dependiendo del caparazón que estés usando.
zsh
, lanomatch
opción predeterminada hará que el comando falle si el directorio no contiene archivos ocultos y no ocultos; podría deshabilitarlonomatch
para evitar eso, pero sería mejor hacerlo en suset -o cshnullglob
lugar (y el comando fallará solo si ninguno de los globos coincide con(t)csh
los shells de Unix anteriores o anteriores).zsh
,pdksh
y su derivada yfish
,.*
la expansión de, no incluye.
y..
, así que esto coincidels -Al
. Con otros proyectiles.
y..
están incluidos para que coincidals -al
. En el último caso, necesitaría cambiar los patrones globales para excluir.
y..
(ls -dUl -- ..?* .[!.]* *
).fish
,(t)csh
ozsh
, si alguno de los patrones globales no coincide con nada,ls
producirá un mensaje de error; puede evitar esto ya sea configurando lanullglob
opción (enbash
ozsh
al menos), o redirigiendostderr
a/dev/null
(ls -dUl -- ..?* .[!.]* * 2>/dev/null
). Si lo usanullglob
, tenga cuidado con el comportamiento potencialmente sorprendente que causa (vea Shell comiendo caracteres `?` ).fish
se comporta comobash
con,nomatch
excepto que cuando es interactivo, se emitirá un mensaje de advertencia para cada globo que no tiene coincidencia.(¡Gracias a Stéphane Chazelas por todos los comentarios!)
fuente
mksh
y,dash
por ejemplo, no clasificará entre mayúsculas y minúsculas.-U
(es decir, sin clasificar) es una extensión GNU. Algunas otrasls
implementaciones como FreeBSD tienen un-U
pero no es para una lista sin clasificar.ls
, necesita--
antes.*
ya que esa implementación acepta opciones después de argumentos (a menos que POSIXLY_CORRECT esté en el entorno)ls
como argumento.[!.]
es correcto. Ver pubs.opengroup.org/onlinepubs/9699919799/utilities/… . Algunos (¿la mayoría?) Shells permiten^
como sinónimo de!
globos de clase de caracteres negados. En cualquier caso, prefiero.[!.] .??* *
que sea un poco más comprensible que.[!.]* ..?* *
Simplemente puede usar dos
ls
comandos separados :A diferencia de las otras respuestas hasta ahora, este enfoque muestra los archivos de puntos primero evitando las entradas
.
y..
, luego las entradas restantes enls
orden alfabético.Las respuestas de @StephenKitt podrían mejorarse para lograr el mismo resultado:
fuente
ls
como argumento. (FWIW estoy usando zsh, pero esto es útil para bash-people, supongo).Puedes jugar con las opciones de comando ls . Prueba esto:
Dónde:
fuente
-X
bandera se ordena por la extensión después de.
, que es totalmente diferente. Además, los archivos están en orden alfabético inverso. Además, aunque los archivos de puntos son los primeros para mi ejemplo, no funcionará en todos los casos (por ejemploa.b
c.d
.a
.c
). Además, has usado en-a
lugar de-A
.