Como ordenar ls por extensão de arquivo e nome?


44

Por padrão, o comando ls classifica apenas por nome de arquivo, mas quero que os diretórios apareçam antes de outros tipos de arquivo. Talvez eu 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?

Respostas:


42

Eu acho que a resposta completa é mais uma combinação dos itens acima.

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

A questão principal parece estar no uso de chaves de classificação primária singulares. Veja esta discussão na lista de discussão para obter algumas dicas.


5
Eu sei que este post é bastante antigo, mas para outros que vieram aqui, por exemplo, do Google (como eu fiz): A combinação de --sort=extensione --group-directories-first(ou apenas --group-directories) funciona bem para mim no Ubuntu 12.10. Também vale a pena tentar na sua máquina! =)
Tomas Aschan

Sim nenhum problema combinando -X / --sort=extensioncom --group-directories-firste qualquer outra coisa que eu tentei em distribuições Linux modernas. O OP está se referindo ao Fedora Core 8 (lançado em 2007), então as chances são de que esses problemas estejam no passado distante.
mattst 8/03

23

No Linux,

$ ls --group-directories-first

( man lsé seu amigo!)


1
votado IN SPITE do comentário da rtfm.
Sridhar Sarnobat

gls --group-directories-firstno Mac se você instalar GNU Core utilssobre o homebrew
To Kra


13

No bash, isso meio que funciona:

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

Portanto, 1. ls fornece sua saída, com os sinalizadores que você deseja 2. cada linha é invertida 3. então eles são classificados 4. e invertidos novamente 5. assim:

  1. como isso:
  2. cada linha é invertida
  3. então eles são ordenados
  4. e invertido novamente Então
  5. ls fornece sua saída, com qualquer sinalizador que você desejar

Ou, mais ao ponto, como abaixo. Eles são classificados pelo último caractere, depois pelo penúltimo etc. Todos os arquivos .rtf, por exemplo, são listados juntos, após um arquivo .save e outro arquivo sem extensão cujo nome termina em 'e'. Depois 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 destinos).

$ ls | rev | classificar | 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 tela 21/01/2011 às 2.17.50 PM.png
 emacs print help.png
 registro
 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 arquivo
 Barra
 docs de varredura de dados
 cmp-mg-ann-numids
 _númidos acabados
 to_annotate_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
 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
 thing4-homedir-links.txt
 bnlinks.txt
 grant.txt
 mata-file-reports.txt
 logx.txt
 logx
 b9-workspace-anndiff.txt ~
 bnlinks.txt ~ 

1
Porém, não listaria os diretórios primeiro.
CarlF

será se vocêls -F
glenn jackman

+1 para o esforço ...
varun

@glennjackman isso é melhor. deve estar na resposta.
vozes

Seria bom (especialmente com -F) se passar por ele reve sortnão tirar a cor ( -G).
vozes

3

Se você não está no Linux,

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

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


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


na verdade, tenho certeza de que isso também funcionará no linux, mas, como outros já declararam, você tem algum suporte interno.
Zac Thompson

1
Funciona em um Mac. Observe que, se você tiver CLICOLORativado, isso removerá a coloração.
039;

1
fornecerá resultados incorretos para nomes de arquivos com espaços.
Glenn Jackman

@glenn, você está certo ... se isso era uma preocupação que eu provavelmente iria substituir o awk com algo como sed -E -e 's/([^ ]+[ ]+){8}//'a retirar os primeiros 8 campos em vez de imprimir a 9ª
Zac Thompson

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

2

Se você estiver executando no Linux, o GNU lssuporta a --sortopção: -

ls --sort=extension

Não foi o que foi pedido.
Sridhar Sarnobat

0

Uma boa abordagem é separar as pastas primeiro, depois os arquivos classificados por extensões , classificando e revertendo:

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

-1

Adicionei ao meu .bashrc (linux) a linha

alias lx = "ls -X"

Dessa forma, basta digitar lx e classificá-lo por extensão.


Portanto, a resposta à pergunta é uso ls -X:)
Andrew

Não o que foi solicitado
Sridhar Sarnobat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.