Como fazer ls classificar por extensão de arquivo e, em seguida, nome?

36

Por padrão, o comando ls classifica apenas pelo nome do arquivo, mas eu quero que os diretórios apareçam antes de outros tipos de arquivo. Eu poderia até querer que os arquivos fossem classificados por extensão, da mesma forma que o Windows Explorer classifica pela coluna de tipos. Existe uma maneira de fazer algo semelhante com ls?

    
por allyourcode 07.08.2009 / 20:23

7 respostas

35

Acho que a resposta completa é mais uma combinação do que foi dito acima.

-X (later --sort=extension) tem sido suportado no Linux desde pelo menos FC3 e será classificado com base na extensão. --group-directories-first foi adicionado mais recentemente (talvez por volta do FC8?). No entanto, combinar os dois parece não funcionar (pelo menos no FC8).

O principal problema parece ser o uso de chaves de classificação primárias singulares. Veja esta discussão da lista de discussão para obter algumas informações.

    
por 07.08.2009 / 22:24
20

No Linux,

$ ls --group-directories-first

( man ls é seu amigo!)

    
por 07.08.2009 / 20:29
13

-X é a opção que você está procurando:

ls -lX
    
por 07.08.2009 / 20:26
11

No bash, isso vai 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.

Então  1. ls dá sua saída, com todas as bandeiras que você quiser  2. cada linha é invertida  3. então eles estão classificados  4. e invertido novamente  5. assim:

  1. assim:
  2. cada linha é invertida
  3. então eles são classificados
  4. e revertido novamente Então
  5. ls fornece sua saída, com todas as sinalizações que você quiser

Ou mais, como abaixo. Eles são classificados pelo último caractere, depois pelo penúltimo, etc. Todos os arquivos .rtf, por exemplo, são listados juntos, depois de um arquivo .save e outro arquivo sem extensão cujo nome termina em 'e'. Em seguida, vêm os arquivos .png e assim por diante. Isso também funcionará com ls -l, porque a extensão normalmente é a última coisa na linha (exceções se você tiver linhas como "tmp @ - > / home / jones / tmp", onde os links são seguidos por seus alvos).

 $ 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~ 
    
por 03.06.2011 / 23:22
3

Se você não está no linux,

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

deve classificar diretórios primeiro (deixe-me saber se estou errado). Não classifica por extensão, porém: você tem que tornar a instrução awk muito mais ocupada se você quiser fazer isso ...

Para também fazê-lo funcionar com nomes contendo espaços, eu provavelmente substituiria o awk por algo como sed -E -e 's/([^ ]+[ ]+){8}//' para remover os primeiros 8 campos em vez de imprimir o 9º

    
por 27.10.2009 / 06:04
2

Se você está rodando no Linux, o GNU ls suporta a opção --sort : -

ls --sort=extension
    
por 07.08.2009 / 20:29
-1

eu adicionei ao meu .bashrc (linux) a linha

alias lx = "ls -X"

Dessa forma, eu simplesmente digito lx e classifico por extensão.

    
por 23.01.2013 / 20:34

Tags