it-swarm.it

Come fare a ordinare ls per estensione di file e poi nome?

Di default il comando ls ordina solo per nomefile, ma voglio che le directory appaiano prima di altri tipi di file. Potrei anche volere che i file siano ordinati per estensione, come il modo in cui Windows Explorer ordina dalla colonna type. C'è un modo per fare qualcosa di simile con ls?

41
allyourcode

Penso che la risposta completa sia più una combinazione di quanto sopra.

-X (later --sort=extension) è stato supportato in Linux almeno da FC3 e si ordinerà in base all'estensione. --group-directories-first è stato aggiunto più recentemente (forse intorno a FC8?). Tuttavia, la combinazione dei due non sembra funzionare (almeno su FC8).

Il problema principale sembra essere l'uso di chiavi di ordinamento primarie singolari. Vedi questo discussione sulla mailing list per alcune informazioni su di esso.

39
CS

Su Linux,

$ ls --group-directories-first

(man ls è tuo amico!)

22
Ned Deily

-X è l'opzione che stai cercando:

ls -lX
13
Carl Manaster

Su bash, questo tipo di lavoro:

$ ls | rev | sort | rev

Da 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.

Quindi 1. ls dà il suo output, con qualsiasi flag desiderato 2. ogni riga è invertita 3. quindi sono ordinati 4. e invertiti di nuovo 5. In questo modo:

  1. come questo:
  2. ogni linea è invertita
  3. poi sono ordinati
  4. e invertito di nuovo Così
  5. ls dà il suo risultato, con tutte le bandiere che vuoi

O, più precisamente, come di seguito. Sono ordinati per ultimo carattere, poi per penultimo, ecc. Tutti i file .rtf, ad esempio, sono elencati insieme, dopo un file .save e un altro file senza estensione il cui nome termina con 'e'. Quindi vengono i file .png e così via. Funzionerà anche con ls -l, perché normalmente l'estensione è l'ultima cosa sulla linea (eccezioni se hai linee come "tmp @ ->/home/jones/tmp", dove i link sono seguiti dai loro obiettivi).

 $ ls | rev | sort | rev 
 cslu1 
 ls.mp2 
 ls.mp3 
 ls.mp4 
 alberi_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 
 Schermata 2011-01-21 at 2.17.50 PM.png 
 emacs print help.png 
 log 
 new_month_log 
 speciale 
 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 
 Barra 
 Data-scan-docs 
 cmp-mg-ann-numids 
 finished_numids 
 to_annotate_numids 
 manls.ps 
 Mike_address_ticket 
 cyp2.out 
 cyp3.out 
 locate-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 
 Cosa4-homedir-links.txt 
 Bnlinks.txt 
 Concessioni .txt 
 mata-file-reports.txt 
 logx.txt 
 logx 
 b9-workspace-anndiff.txt ~ 
 bnlinks.txt ~ 
11
M. Mandel

Se non sei su Linux,

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

dovrebbe prima ordinare le directory (fammi sapere se ho torto). Non ordina per estensione, però: devi rendere l'istruzione awk molto più impegnativa se vuoi farlo ...


Per farlo funzionare anche con nomi contenenti spazi, probabilmente sostituirò l'awk con qualcosa come sed -E -e 's/([^ ]+[ ]+){8}//' per rimuovere i primi 8 campi invece di stampare il nono

3
Zac Thompson

Se stai usando Linux, GNU ls supporta l'opzione --sort: -

ls --sort=extension
2
DaveR

Un buon approccio è la separazione cartelle all'inizio, poi i file ordinati per estensione , SORTING e REVERSING out:

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