Me gusta poder nombrar archivos y directorios con un prefijo de subrayado si es algo que quiero mantener separado de otros archivos y directorios en el mismo nivel. En Windows y Mac, por ejemplo, el prefijo de un archivo con un guión bajo lo ordena al principio, delante de los archivos que comienzan con un carácter alfanumérico.
Se descubrió que Google tiene que ver con LC_COLLATE y mi ubicación actual (en_US). Eso está bien, aunque realmente no entiendo por qué en_US no se ordena como se esperaba.
Basado en la configuración regional del sitio de demostración de ICU Collate en en_US_POSIX ciertamente parece tener el orden de clasificación que estoy buscando (debe editar los datos de muestra y agregar algunos guiones bajos para probarlo). Pero realmente no veo cómo aplicar esto en mi shell de Linux.
Idealmente, me gustaría poder configurar algo en mi configuración bash para que ls siempre clasifique los guiones bajos primero. ¿Cómo haría para hacer esto?
Respuestas:
Si no puede
ls
ordenar de la manera que desea, pruebe la expansión de shell.Puede usar patrones de nombre de archivo para ejecutar
ls
con una lista de archivos que el shell ya ordenó, omitiendo el método quels
usa.Asumiendo que tienes los archivos
esto es como correr
Explicación:
_*
es un patrón de shell que coincide con cualquier nombre de archivo que comienza con un guión bajo, expandido en orden alfabético.[!_]*
coincide con cualquier nombre de archivo que no comience con un guión bajo, expandido en orden alfabético.-f
le dicels
a no ordenar, porque el shell ya lo hizo.Más información: expansión de nombre de archivo bash
Si hay directorios en el directorio actual, querrá ejecutar el comando de esta manera para evitar la inclusión de archivos en los directorios:
fuente
_
para hacer que los archivos aparezcan primero es un truco específico del sistema operativo; y la versión unix de este truco es comenzar el nombre del archivo con una letra mayúscula: la convención predeterminada de Unix es usar solo letras minúsculas en los nombres de los archivos.00README
.-f
le dice quels
no haga su propia clasificación, por lo que muestra sus argumentos en el orden en que se pasan. El resultado de cada expansión de comodín de shell_*
y[!_]*
es una lista ordenada lexicográficamente.ls
se ordenan (en dos grupos: los que comienzan con_
los otros) cuando son generados por el shell. Correecho ls -lf _* [!_]*
para ver qué pasa. La-f
bandera le dice quels
no haga ninguna clasificación.Si no le importa mezclar minúsculas y mayúsculas, establezca su configuración regional en
C
, que toma los caracteres en su orden numérico._
cae entre mayúsculas y minúsculas.La configuración regional
LC_MESSAGES
(idioma de los mensajes de error),LC_CTYPE
(juegos de caracteres) yLC_TIME
(formato de fecha y hora) son muy útiles.LC_COLLATE
yLC_NUMERIC
generalmente son más problemáticos de lo que valen, no recomiendo configurarlos. La ordenación lexicográfica adecuada es más complicada de lo queLC_COLLATE
se supone que debe especificar, y puede causar todo tipo de comportamientos extraños cuando usa rangos de caracteres en expresiones regulares.LC_NUMERIC
es principalmente cosmético, excepto cuando algo sale terriblemente mal porque algún programa produjo un número con un separador decimal distinto de.
.fuente
VAR=value cmd
conjuntosVAR
avalue
sólo en el entorno decmd
y no toca el valor (o la ausencia de valor) en el shell en el que se ejecuta. Para que el guión bajo aparezca antes que en mayúscula, deberá definir su propia configuración regional. Esto es posible, pero difícil de usar, porque al menos en Linux, la biblioteca estándar solo busca definiciones de configuración regional/usr/lib/locale
: no hay ninguna~/.locale
variable de entorno en la que pueda establecer suen_tom
configuración.ls
comando, sigue la sugerencia de Mikel .Desafortunadamente, Linux usa glibc para su información local, no ICU, por lo que no hay forma de aplicarlo directamente a Linux sin gastar mucho esfuerzo, ya sea readaptando ICU en glibc o complementando la información local en glibc.
fuente
Agregar el
-f
interruptor (sin ordenar) hizo que se mostrara así para mí.man ls
fuente
touch 3 1 _1 _3 2 _2 && ls -fl
salidas2 . 1 3 _2 _3 .. _1