Como colunino uma lista de itens com largura mínima?

7

Como colunino qualquer entrada lsnão colunada como faz?

ls está criando uma tabela otimizada com largura mínima para cada linha, por exemplo:

ls

2  dsao  file with space  with
5  e     g                wsdl-rubo-6cb0f1a9086e80c
d  file   leading space

mas se eu alimentar a saída column(por exemplo, cada arquivo em uma linha), ela preencherá todas as linhas da mesma largura, para que se ajuste à largura da tela:

for i in *; do echo "$i"; done | column

2                               file with space                          
5                               g                                        
d                                leading space                           
dsao                            with                                     
e                               wsdl-rubo-6cb0f1a9086e80c                
file

(Eu uso apenas a lista de arquivos aqui para gerar a mesma saída do exemplo. Estou procurando uma solução para colocar em coluna outras coisas no final.)

Como posso colunizar qualquer saída com uma largura de coluna variável?

rubo77
fonte
Ok, uma leitura alternativa da sua solicitação, se eu entendi corretamente os seus comentários, seria " colocar a entrada em colunas como column -c_ n-x`, mas encaixar a saída no menor número possível de colunas da tela, em vez de preencher a largura especificada". Isso está correto?
jthill
Sim, quase: além disso, deve haver o maior número possível de colunas que couber na tela. (como lsgerencia). Talvez a gente encontrar a solução, se olharmos para o código fonte do código fonte do lscomando no coreutils
rubo77

Respostas:

5

Obrigado @ rubo77 por perguntar isso, é um ótimo exercício. Para mim, foi com erros pontuais que o inglês é o Tough Stuff, o ritmo estragado: ficou divertido, rápido, mesmo que o próprio algoritmo aqui seja bastante simples.

[edição final: movida para https://github.com/jthill/columnate/blob/master/columnate , bug corrigido, implementado em linhas principais. ]

jthill
fonte
você também deve colocar isso no github. Se for mais rápido que o ls-algorythm, talvez você possa criar um ls-util mais rápido?
rubo77
@ rubo77 Você precisa alimentar a variável COLUMNS. veja o comentário 'teste com' no código. E isso 10x-20x é o contrário, é mais lento, principalmente porque é awk vs C.
jthill
time ls | sort | columnate COLUMNS=$COLUMNS
jthill
Você é um gênio. Isso tem que ser publicado para todas as distribuições linux
rubo77
eh, obrigado, sério, mas isso é muito forte. leia o código, é quase força bruta
jthill 22/11/2013
3

Algo próximo à saída de ls:

for i in *; do echo -en "${i}\t"; done; echo
Radu Rădeanu
fonte
bom, ele só está pulando na fila, se as linhas de entrada tiverem mais de uma guia de largura. Existe uma maneira de impedir uma interrupção da saída no lado direito da janela?
rubo77