¿Cómo hacer que ls ordene por extensión de archivo y luego nombre?

44

Por defecto, el comando ls se ordena solo por nombre de archivo, pero quiero que los directorios aparezcan antes que otros tipos de archivos. Incluso podría querer ordenar los archivos por extensión, como la forma en que el explorador de Windows ordena por columna de tipo. ¿Hay alguna manera de hacer algo similar con ls?

allyourcode
fuente

Respuestas:

42

Creo que la respuesta completa es más una combinación de lo anterior.

-X (later --sort=extension)ha sido compatible con Linux desde al menos FC3 y se ordenará según la extensión. --group-directories-firstfue agregado más recientemente (¿quizás alrededor de FC8?). Sin embargo, combinar los dos no parece funcionar (al menos en FC8).

El problema principal parece ser el uso de claves de clasificación primarias singulares. Vea esta discusión en la lista de correo para obtener información sobre ella.

JakeGould
fuente
55
Sé que esta publicación es bastante antigua, pero para otros que vienen aquí, por ejemplo, Google (como lo hice): la combinación de --sort=extensiony --group-directories-first(o solo --group-directories) funciona bien para mí en Ubuntu 12.10. Vale la pena intentarlo en tu máquina también. =)
Tomas Aschan
Si no hay problema combinando -X / --sort=extensioncon --group-directories-firsty todo lo demás que he probado en modernas distribuciones de Linux. El OP se refiere a Fedora Core 8 (lanzado en 2007), por lo que es probable que tales problemas estén en el pasado distante.
Mattst
23

En Linux,

$ ls --group-directories-first

( man lses tu amigo!)

JakeGould
fuente
1
votado EN ESPACIO del comentario rtfm.
Sridhar Sarnobat
gls --group-directories-firsten Mac si instala GNU Core utilssobre homebrew
Para Kra
14

-X es la opción que estás buscando:

ls -lX
Carl Manaster
fuente
13

En bash, esto funcionará:

$ ls | rev | sort | rev

De man rev:

 The rev utility copies the specified files to the standard output,
 reversing the order of characters in every line.  If no files are speci-
 fied, the standard input is read.

Entonces 1. ls da su salida, con cualquier indicador que desee 2. cada línea se invierte 3. luego se ordenan 4. y se invierten nuevamente 5. así:

  1. Me gusta esto:
  2. cada línea se invierte
  3. entonces están ordenados
  4. y revertido de nuevo
  5. ls da su salida, con cualquier indicador que desee

O, más al punto, como a continuación. Se ordenan por último carácter, luego penúltimo, etc. Todos los archivos .rtf, por ejemplo, se enumeran juntos, después de un archivo .save y otro archivo sin extensión cuyo nombre termina en 'e'. Luego vienen los archivos .png, y así sucesivamente. Esto también funcionará con ls -l, porque la extensión es normalmente lo último en la línea (excepciones si tiene líneas como "tmp @ -> / home / jones / tmp", donde los enlaces son seguidos por sus objetivos).

$ ls | rev | sort | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 PALMADITA
 CSLU
 Formulario de proxy.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 para_anotar_tamaño
 Matas-time-by-week-Integration2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 platypus.rtf
 Captura de pantalla 21-01-2011 a las 2.17.50 PM.png
 emacs print help.png
 Iniciar sesión
 new_month_log
 especial
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 foo
 dofoo
 100811_desde_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 limpieza de archivos
 bar
 documentos de escaneo de datos
 cmp-mg-ann-numids
 acabados_numidos
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 localizar-cyp.out
 manls.out
 DWE_BEN_89808.2.text
 tag2.txt
 l2.txt
 du-h-d3.txt
 finished_ann_numids_110407_1714.txt
 finished_all_numids_110407_1718.txt
 data-dir-scan.perl.doc.txt
 whence-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-workspace-anndiff.txt
 tag.txt
 duh.txt
 do-mail.txt
 safextn.txt
 mg3longhdr.txt
 finished_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 grant.txt
 mata-file-reports.txt
 logx.txt
 logx
 b9-workspace-anndiff.txt ~
 bnlinks.txt ~ 
M. Mandel
fuente
1
Sin embargo, no enumeraría los directorios primero.
CarlF
lo hará si ustedls -F
glenn jackman
+1 por el esfuerzo ...
varun
@glennjackman eso está mejor. debería estar en la respuesta.
voces
Sería bueno (especialmente con -F) si lo pasa revy sortno quita el color ( -G).
voces
3

Si no estás en Linux,

ls -l |sort -d -k 1.1,1.1r -k 9 |awk '{print $9}'

primero debe ordenar los directorios (avíseme si me equivoco). Sin embargo, no se ordena por extensión: debe hacer que la declaración awk sea mucho más ocupada si desea hacer eso ...


Para que también funcione con nombres que contienen espacios, probablemente reemplazaría el awk con algo como sed -E -e 's/([^ ]+[ ]+){8}//'eliminar los primeros 8 campos en lugar de imprimir el noveno

Zac Thompson
fuente
en realidad, estoy bastante seguro de que esto también funcionará en Linux, pero como otros han dicho, tienes soporte incorporado allí.
Zac Thompson
1
Funciona en una Mac. Tenga en cuenta que si ha CLICOLORactivado esto eliminará el color.
eykanal
1
dará resultados incorrectos para nombres de archivos con espacios.
Glenn Jackman
@glenn, tienes razón ... si esto fuera una preocupación, probablemente reemplazaría el awk con algo como sed -E -e 's/([^ ]+[ ]+){8}//'eliminar los primeros 8 campos en lugar de imprimir el noveno
Zac Thompson,
ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
nohillside
2

Si está ejecutando en Linux, GNU lsadmite la --sortopción: -

ls --sort=extension
DaveR
fuente
No es lo que se pidió.
Sridhar Sarnobat
0

Un buen enfoque es separar las carpetas al principio, luego los archivos ordenados por extensiones , por ORDENAR y REVERTIR:

ls -p | grep /;ls -p | grep -v / | rev | sort | rev
PYK
fuente
-1

Agregué a mi .bashrc (linux) la línea

alias lx = "ls -X"

de esa manera solo escribo lx y lo ordeno por extensión.

usuario192273
fuente
Entonces la respuesta a la pregunta es usar ls -X:)
Andrew
No es lo que se pidió
Sridhar Sarnobat