it-swarm.dev

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

Por defecto, el comando ls se ordena solo por nombre de archivo, pero quiero que los directorios aparezcan antes que otros tipos de archivos. Puede que incluso quiera que los archivos se ordenen por extensión, como la forma en que el Explorador de Windows ordena por tipo de columna. ¿Hay una manera de hacer algo similar con ls?

41
allyourcode

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-first se agregó más recientemente (¿quizás alrededor de FC8?). Sin embargo, la combinación de los dos no parece funcionar (al menos en FC8).

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

39
CS

En linux

$ ls --group-directories-first

(man ls es tu amigo!)

22
Ned Deily

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

ls -lX
13
Carl Manaster

En bash, esto funcionará:

$ ls | rev | sort | rev

Desde 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 marca que quieras 2. cada línea se invierte 3. luego se clasifican 4. y se invierten de nuevo 5. así:

  1. me gusta esto:
  2. cada linea esta invertida
  3. entonces están ordenados
  4. y revertido de nuevo Así
  5. ls da su salida, con las banderas que quieras.

O, más al punto, como abajo. Están ordenados por el último carácter, luego el siguiente al ú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 tienes líneas como "tmp @ ->/home/jones/tmp", donde los enlaces siguen sus objetivos).

 $ ls | rev | sort | rev 
 cslu1 
 ls.mp2 
 ls.mp3 
 ls.mp4 
 trees_110214-15 
 PAT 
 CSLU 
 Proxy Form.doc 
 Finannbyid 
 Toannbyid 
 101209ssi.txt.save 
 To_annotate_size 
 Matas-time -by-week-integration2.rtf 
 cyp3.rtf 
 data-dir-scan.Perl.doc.rtf 
 whence-r21-numid.rtf 
 platypus .rtf 
 Captura de pantalla 2011-01-21 a las 2.17.50 PM.png 
 emacs print help.png 
 log 
 new_month_log 
 special 
 Google-ngram-critique.html 
 Perl_path.html 
 Nl 
 DWE_BEN_89808.2.ann 
 Foo 
 Dofoo 
 100811_from_iMac_Documents_in_dock.Zip 
 To-palikir.Zip 
 Tmp 
 File-cleanup 
 Bar 
 Data-scan-docs 
 cmp-mg-ann-numids 
 finish_numids 
 to_annotate_numids 
 manls.ps 
 Mike_address_ticket 
 cyp2.out 
 cyp3.out 
 find-cyp.out 
 manls.out 
 DWE_BEN_89808.2.text [.___ _.] tag2.txt 
 l2.txt 
 du-h-d3.txt 
 finished_ann_numids_110407_1714.txt 
 completed_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 
 .txt 
 mata-file-reports.txt 
 logx.txt 
 logx 
 b9-workspace-anndiff.txt ~ 
 bnlinks.txt ~ 
11
M. Mandel

Si no estás en Linux,

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

debería ordenar los directorios primero (avisarme si me equivoco). Sin embargo, no ordena por extensión: tiene que hacer la declaración awk mucho más ocupada si quiere hacer eso ...


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

3
Zac Thompson

Si está ejecutando Linux, GNU ls admite la opción --sort: -

ls --sort=extension
2
DaveR

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

ls -p | grep /;ls -p | grep -v / | rev | sort | rev
0
PYK