'Ls' de Unix ordenar por nombre

127

¿Puedes ordenar un listado de ls por nombre?

Devang Kamdar
fuente
10
Si no está ordenando por nombre sin ningún argumento, es posible que desee verificar si ls ha sido alias a otra cosa, o simplemente invocarlo usando la ruta completa que eliminaría cualquier alias que exista.
tvanfosson
gnu-coreutils ls ordena por defecto. ¿Qué sistema estás usando (como otros han preguntado)
Nick Fortescue
¿Está seguro de que está pidiendo ordenar por nombre y no por tipo (es decir, primero el directorio y luego los archivos)?
Curtisk
Las letras mayúsculas van antes que las minúsculas, por lo tanto, el archivo Z viene antes que el archivo a ... ¿cómo puedo solucionarlo?
ArtOfWarfare
La página man dice 'ordenado por separado y en orden lexicográfico'. Los archivos se ordenan según el primer carácter: caracteres numéricos [0..9] y SUPERIOR [A..Z] y caracteres lowe [a..z]
Gürol Canbek

Respuestas:

131

Mi ls ordena por nombre por defecto. ¿Qué estas viendo?

man ls estados:

List information about the FILEs (the current directory by default). Sort entries alpha‐betically if none of -cftuvSUX nor --sort is specified.:

Evert
fuente
lsno se ordena si se -c1especifica: ¿hay alguna manera de hacerlo? ( --sort=nameno parece funcionar)
dhc
1
Eso no es verdad. con ls -la, ya veo:, el .bashrc - can - .config - Downloads - .local - tmpnombre sería:.bashrc - .config - .local - Downloads - can - tmp
12431234123412341234123
1
el mío dice que 100.jpg viene antes de 10.jpg. Tiene sentido, supongo que si "0" viene antes de "". pero todavía no es intuitivo
chiliNUT
Estoy viendo "M" antes de "b". Confuso. Espera, ¿importa la capitalización?
Daniel Springer
105

Para algo simple, puede combinar ls con sort . Para solo una lista de nombres de archivo:
ls -1 | ordenar

Para ordenarlos en orden inverso:
ls -1 | sort -r

marca
fuente
3
¿Hay alguna manera de ordenar archivos como este: ls | sort -n 1.1.1; 1.1.2; 1.1.3; 2.10.1; 2.10.15; 2.10.2; 2.10.20; 2.10.21; 2.1.1; 2.1.10; 2.1.15; 2.1.2; 2.1.3; 2.1.4; 10.1.1; 10.1.2; 10.1.3; 11.0.1; 11.0.2; 11.0.20; 11.0.21; 11.0.22; Como puede ver 2.10.15 antes de 2.10.2 .
BBK
Estoy haciendo un desarrollo de Android en un dispositivo Pidion, y ls no se ordena automáticamente, ¡así que fue muy útil! El único problema es que parece que ordena los enlaces blandos pero no ordena los archivos, por alguna razón
Mitch
En Mac, parece que ese segundo comando se puede acortar ls -1r.
Ash Ryan Arnwine
44
@BBK sort -V ordenará por números de versión, por lo que obtendrá ... 2.10.2; 2.10.15; .. from man sort .. --sort = WORD se ordenará según WORD: general-numeric -g, human-numeric -h, month -M, numeric -n, random -R, version -V
mosh
35

lsfrom coreutilsrealiza una ordenación basada en la configuración regional de forma predeterminada y, por lo tanto, puede producir resultados sorprendentes en algunos casos (por ejemplo, %foose ordenará entre bary quuxdentro LANG=en_US). Si desea una clasificación ASCIIbetical, use

LANG=C ls
Richard Smith
fuente
LANGSin tener en cuenta el comportamiento de clasificación, esta publicación me ayudó mucho.
yurenchen
Esto funcionó para mí también. ¿Podrías dar más detalles sobre esto? ¿Por qué se ordena de manera diferente?
Kostas
1
Esta dosis funciona, pero la salida ?para cada carácter no ascii cuando la salida es un terminal (la característica incorrecta de ls verifica si sale a un terminal, funciona cuando se canaliza). Puede "arreglar" esto con tuberías a cat, usar la C.UTF-8configuración regional (si su sistema lo admite) y / o usar la -bbandera. Aún mejor, no lo use lsen absoluto, mejor uso `
12431234123412341234123
Esto me ayudó a descubrir que, para mí, el problema era que algunos de mis nombres de archivo contenían un guión (-) y otros un guión (-). lsordena guiones antes de guiones.
Jamy Mahabier
17

La belleza de las herramientas * nix es que puedes combinarlas:

ls -l | sort -k9,9

La salida de ls -lse verá así

-rw-rw-r-- 1 luckydonald luckydonald  532 Feb 21  2017 Makefile
-rwxrwxrwx 1 luckydonald luckydonald 4096 Nov 17 23:47 file.txt

Entonces, con la 9,9clasificación de la columna 9hasta la columna 9, son los nombres de los archivos. Debe proporcionar dónde detenerse, que es la misma columna en este caso. Las columnas comienzan con 1.

Además, si desea ignorar mayúsculas / minúsculas, agregue --ignore-caseal comando ordenar.

usuario491575
fuente
1
Que -k9,9significa
luckydonald
Descubierto, significa ordenar la columna 9hasta la misma columna 9. Una lssalida normal se ve así: drwx------ 8 999 user 4.0K Feb 5 2017 file.txtasí que la columna 9 son los nombres de los archivos. Si quieres ignorar el caso, úsalo --ignore-caseen sort.
luckydonald
8

AVISO: "a" viene DESPUÉS de "Z":

$ touch A.txt aa.txt Z.txt

$ ls

A.txt Z.txt aa.txt

russian_spy
fuente
3
Esto no siempre es cierto. No sé exactamente las circunstancias que hacen que esto no sea cierto, pero en mi máquina que ejecuta Ubuntu 12.04 la salida de ls está ordenada alfabéticamente (ignorando mayúsculas y minúsculas).
Patrick James McDougle
¡Buena atrapada! Parece que lo está ordenando en base al código ASCII. Los alfabetos en mayúsculas van seguidos de minúsculas.
Kent Pawar
1
Noté que mi MacOS ordena los primeros números, luego las letras mayúsculas, luego el subrayado y luego las letras minúsculas. Es curioso que no distingan entre mayúsculas y minúsculas. Por otro lado, mi Debian distingue entre mayúsculas y minúsculas, pero clasifica las letras insensiblemente a menos que haya un empate, ¡entonces gana en minúsculas! Ejemplo: ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt
zk82
Estoy en un MAC también. Me decepcionó ver el tipo de clasificación A, Z, a, z. Estoy aquí porque prefiero tener A, a, Z, a. Gracias por tu consejo. Probaré las normalsoluciones aquí.
nyxee
8

Los archivos que son diferentes solo por una cadena numérica se pueden ordenar en este número a condición de que esté precedido por un separador.

En este caso, se puede usar la siguiente sintaxis:

ls -x1 file | sort -t'<char>' -n -k2

Ejemplo:

ls -1 TRA*log | sort -t'_' -n -k2

TRACE_1.log
TRACE_2.log
TRACE_3.log
TRACE_4.log
TRACE_5.log
TRACE_6.log
TRACE_7.log
TRACE_8.log
TRACE_9.log
TRACE_10.log
poni
fuente
4

Desde la página del manual (para bash ls):

Ordene las entradas alfabéticamente si ninguna de -cftuSUX ni --sort.

jwoolard
fuente
3
No hay "bash ls". Do "which ls"
Norbert Hartl
@ Norbert: Tienes razón, pero which lstendría éxito incluso si bash tuviera un ls incorporado. Más bien, hazlo builtin lsen bash y obtén un error.
Pianosaurus
44
@ Norbert: whichsiempre devuelve una ruta. Se usa type lspara determinar qué piensa el shell ls(integrado, función, ejecutable).
Ephemient
3

La lsutilidad debe cumplir con IEEE Std 1003.1-2001 ( POSIX.1) que establece:

22027: clasificará los operandos con y sin directorio por separado de acuerdo con la secuencia de clasificación en el entorno local actual.

26027: Por defecto, el formato no está especificado, pero la salida se ordenará alfabéticamente por nombre de símbolo:

  • Nombre de biblioteca u objeto, si se especifica −A
  • Nombre del símbolo
  • Tipo de símbolo
  • Valor del símbolo
  • El tamaño asociado con el símbolo, si corresponde.
kenorb
fuente
2

Verifique su .bashrcarchivo para los alias.

Sujit
fuente
77
Uno podría simplemente escribir aliaspara verificar todos los alias actuales.
Krzysztof Jabłoński
2

ls -X funciona para ese propósito, en caso de que haya alias ls a un valor predeterminado más útil.

jezzo
fuente
0
In Debian Jessie, this works nice:

ls -lah --group-directories-first

# l=use a long listing format
# a=do not ignore entries starting with .
# h=human readable
# --group-directories-first=(obvious)
# Note: add -r for reverse alpha

# You might consider using lh by appending to ~/.bashrc as the alias:
~$ echo "alias lh='ls -lah --group-directories-first'" >>~/.bashrc
# -- restart your terminal before using lh command --
James T
fuente