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


38

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?

Risposte:


37

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

-X (later --sort=extension) è stato supportato in Linux da almeno FC3 e si ordinerà in base all'estensione. --group-directories-first è stato aggiunto più di recente (forse intorno all'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. Guarda questo discussione sulla mailing list per qualche intuizione in esso.


4
So che questo post è piuttosto vecchio, ma ad altri che vengono qui ad es. Google (come ho fatto io): la combinazione di --sort=extension e --group-directories-first (o solo --group-directories ) funziona bene per me su Ubuntu 12.10. Vale la pena sparare anche sulla tua macchina! =)
Tomas Aschan

20

Su Linux,

$ ls --group-directories-first

( man ls È tuo amico!)


1
upvoted IN SPITE del commento rtfm.
Sridhar-Sarnobat

gls --group-directories-first su Mac se si installa GNU Core utils su homebrew
To Kra


11

Su bash, questo tipo di lavoro:

$ ls | rev | sort | rev

A partire dal 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.

Così  1. ls dà il suo risultato, con qualsiasi bandiera che si desidera  2. ogni riga è invertita  3. quindi sono ordinati  4. e invertito 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 @ - & gt; / home / jones / tmp", dove i collegamenti sono seguiti dai loro obiettivi).

 $ 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
 Screen shot 2011-01-21 at 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
 d.o.foo
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 file-cleanup
 bar
 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
 d.o-mail.txt
 safextn.txt
 mg3longhdr.txt
 finished_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 grants.txt
 mata-file-reports.txt
 logx.txt
 logx
 b9-workspace-anndiff.txt~
 bnlinks.txt~ 

1
Non elencerei le directory prima, però.
CarlF

lo sarà se tu ls -F
glenn jackman

+1 per lo sforzo ...
varun

@glennjackman è meglio. dovrebbe essere nella risposta.
tjt263

Sarebbe bello (specialmente con -F ) se lo convogliano rev & Amp; sort non ha tolto il colore ( -G ).
tjt263

3

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 di simile sed -E -e 's/([^ ]+[ ]+){8}//' per rimuovere i primi 8 campi invece di stampare il 9


in realtà, sono abbastanza sicuro che funzionerà anche su linux, ma come altri hanno affermato di avere un supporto integrato lì.
Zac Thompson

1
Funziona su un Mac. Nota che se lo hai CLICOLOR acceso questo rimuoverà la colorazione.
eykanal

1
darà risultati errati per nomi di file con spazi.
glenn jackman

@glenn, hai ragione ... se questa fosse una preoccupazione probabilmente sostituirò l'awk con qualcosa del genere sed -E -e 's/([^ ]+[ ]+){8}//' per rimuovere i primi 8 campi invece di stampare il 9
Zac Thompson

ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
nohillside

2

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

ls --sort=extension

Non è quello che è stato chiesto.
Sridhar-Sarnobat

0

Un buon approccio si sta separando cartelle all'inizio, poi il file ordinati per estensione , da SORTING e REVERSING out:

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

-1

Ho aggiunto al mio .bashrc (linux) la linea

alias lx = "ls -X"

In questo modo scrivo solo lx e ottengolo ordinato per estensione.


Quindi la risposta alla domanda è l'uso ls -X :)
Andrew

Non è quello che è stato chiesto
Sridhar-Sarnobat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.