Tengo un montón de archivos de log1
a log164
.
Estoy tratando de LISTAR el directorio (ordenado) en un terminal UNIX, pero las funciones de clasificación solo proporcionan el formato de esta manera:
home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc
Lo que quiero es
home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc
¿Alguna sugerencia sobre lo que podría usar para hacer esto?
log1.gz
a travéslog164.gz
, entonces, ¿qué es lo que aún necesitals -1
de ellos para?ls -1
hace: enumera los nombres de archivo. Como ya conocías los nombres de archivo, no entendí para qué lo necesitabas. Pero como has aceptado la respuesta de Kevin, ahora sé: no la necesitabas. Lo que tiene más sentido. :-)Respuestas:
bash
Los frenos,{}
los enumerarán en orden:fuente
¿Por qué no utilizar la
ls
función incorporada para este caso en particular?-v natural sort of (version) numbers within text
Por ejemplo
ls -1v log*
fuente
sort
, en caso de que uno tenga una serie de cadenas en lugar de un directorio de archivos-v - Force unedited printing of non-graphic characters
.ls | sort -n
Con GNU ls (es decir, en Linux, Cygwin u otros sistemas que tienen GNU ls específicamente instalado):
En zsh:
En otras conchas:
Reemplace
echo
porprintf '%s\n'
si desea que cada nombre de archivo esté en una línea separada.Si también desea metadatos de archivo (
ls -l
) y no tiene GNU ls, deberá llamarls
por separado para cada nombre de archivo o grupo de nombres de archivo que desea ver en orden lexicográfico.Para evitar estas dificultades, use suficientes ceros a la izquierda en los nombres de sus archivos para que el tipo lexicográfico sea amigable para los humanos (
log001.gz
, etc.).fuente
Si bien la solución
ls -1v
es ciertamente la mejor en este caso particular, creo que es bueno tener también una que funcionesort
como en la pregunta original, ya que esto también funciona cuando su entrada no provienels
. En este caso puedes usar:La
-n
opción le dice a sort que clasifique numéricamente y-k 1.4
establece la clave de clasificación en el primer campo (que es el nombre de archivo completo en este caso) comenzando desde el 4º carácter hasta el último.fuente
ls -1 | sort -n -k1.4
no funciona. Le da a los no clasificados al principio hasta 4 caracteres y luego los ordenados después del 4 ° carácter. En suls -1 |sort | sort -n -k1.4
lugar, utilicé y funcionó perfectamente.sort -k1.1,1.3 -k1.4n
.sort
No es necesario que las implementaciones sean estables, por lo que su enfoque no funcionará con todas las implementaciones. Vea también la-V
opción de GNU y FreeBSDsort
.El GNU
sort
(como está disponible en Linux) tiene un modo de "clasificación de versiones" que interpreta los números dentro de números que no son números de la manera que usted solicita:De
man 1 sort
:(Creación de archivos de prueba vacío a la lista:
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz
)Su caso de ejemplo, agregando la
-V
opción (o--version-sort
):fuente
si usa Mac o BSD intente esto:
fuente
Mi versión de Solaris no es compatible
ls -v
(grrr). Y la solución de clasificación proporcionada anteriormente 1) requiere el conocimiento de la posición de los dígitos en el nombre del archivo, y 2) no maneja cosas como números de versión de varias partes.El siguiente enfoque es compatible con Solaris, no requiere conocimiento previo de las posiciones de los dígitos y maneja los números de versión con 2, 3 o 4 componentes (como: a-1.2, foo-5.6.7, bar_baz_9.10.11.12). También se usa
sort -f
para plegar mayúsculas y minúsculas, y maneja correctamente directorios entremezclados con archivos:ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n
Tenga en cuenta que esta versión limita el primer componente a un solo dígito.
Si su sistema operativo objetivo es compatible
ls -v
, esa es claramente la solución superior.fuente
Solución Perl:
fuente
fuente
-t .
es superfluo aquí.Esto funcionó para mí.
Tengo archivos 1.jpg 2.jpg ... 18.jpg
$ echo *.jpg | tr -s ' ' '\n' | sort -n
sort
se está confundiendo con lals
salida debido a los caracteres de color no imprimibles. Si intentas esto:ls -1 --color=none *.jpg | sort -n
Funcionará perfectamente.
sort
puede ignorar los caracteres no imprimibles con la-i
opción, pero todavía no funciona y no sé por qué.Pero siempre puedes quitar un color como este y
sort
funcionará:ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n
Espero que algún día
sort
tenga una opción para esto.fuente