it-swarm-pt.tech

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

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. Talvez até queira que os arquivos sejam classificados por extensão, como a maneira como o Windows Explorer classifica pela coluna de tipos. Existe uma maneira de fazer algo semelhante com ls?

41
allyourcode

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

-X (later --sort=extension) tem suporte no Linux desde pelo menos FC3 e irá classificar 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).

A questão principal parece ser com o uso de chaves de classificação primárias singulares. Veja isto discussão de lista de discussão para alguma introspecção nele.

39
CS

No Linux,

$ ls --group-directories-first

(man ls é seu amigo!)

22
Ned Deily

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

ls -lX
13
Carl Manaster

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 qualquer sinal que você quiser 2. cada linha é invertida 3. então eles são ordenados 4. e revertidos novamente 5. assim:

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

Ou, mais precisamente, 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 | ordenação | rev 
 cslu1 
 ls.mp2 
 ls.mp3 
 ls.mp4 
 trees_110214-15 
 PAT 
 CSLU 
 Formulário de Proxy.doc 
 Finannbyid 
 Toannbyid 
 101209ssi.txt.save 
 Para_annotate_size 
 Matas-time -by-week-integration2.rtf 
 cyp3.rtf 
 dados-dir-scan.Perl.doc.rtf 
 whence-r21-numid.rtf 
 ornitorrinco .rtf 
 Screen shot 2011-01-21 at 2.17.50 PM.png 
 emacs imprimir ajuda.png 
 log 
 new_month_log 
 especial 
 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 
 Limpeza de arquivos 
 Bar 
 Dados-scan-docs 
 cmp-mg-ann-numids 
 finished_numids 
 para_notificar_numids 
 manls.ps 
 Mike_address_ticket 
 cyp2.out 
 cyp3.out 
 localize-cyp.out 
 manls.out 
 DWE_BEN_89808.2.text [.___ _.] tag2.txt 
 l2.txt 
 du-h-d3.txt 
 terminou_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 
 faça-mail.txt 
 safextn.txt 
 mg3longhdr.txt 
 finished_numids.txt 
 41692-langnames.txt 
 TimeAnnotationGuidelines.txt 
 41langs.txt 
 Coisa4-homedir-links.txt 
 Bnlinks.txt 
 Concessões .txt 
 mata-arquivo-reports.txt 
 logx.txt 
 logx 
 b9-workspace-anndiff.txt ~ 
 bnlinks.txt ~ 
11
M. Mandel

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 declaraçã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 8 primeiros campos em vez de imprimir o 9º.

3
Zac Thompson

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

ls --sort=extension
2
DaveR

Uma boa abordagem é separar pastas no começo, depois o arquivos ordenados por extensão, por SORTING e REVERSING out:

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