Aqui está a extensão da pergunta: Como limite o número de arquivos impressos por ls?
com condição adicional: como imprimir os resultados em quantas colunas caberem na largura atual do terminal - como ls
faz por padrão.
Eu entendo como limitar o número de arquivos por head
comando, mas não encontrei a solução sobre como imprimir arquivos em colunas da mesma forma que ls
faz por padrão, mas após o processamento através do pipe.
Eu tentei ls -C
sinalizar (de man ls
:) -C list entries by columns
com tubulação para cat
. Mas sua saída difere de ls
fora:
for i in {1..30}; do touch file$i; done; echo '"ls" out:'; ls; echo '"ls -C | cat" out:'; ls -C | cat
"ls" out:
file1 file11 file13 file15 file17 file19 file20 file22 file24 file26 file28 file3 file4 file6 file8
file10 file12 file14 file16 file18 file2 file21 file23 file25 file27 file29 file30 file5 file7 file9
"ls -C | cat" out:
file1 file12 file15 file18 file20 file23 file26 file29 file4 file7
file10 file13 file16 file19 file21 file24 file27 file3 file5 file8
file11 file14 file17 file2 file22 file25 file28 file30 file6 file9
"ls" out fornece 2 linhas. E "ls -C | cat" out fornece 3 linhas. Isso pode ser ls -C
um bug?
Eu tentei column
o comando. Mas quando um arquivo com nome mais longo está presente, ele fornece resultados diferentes de ls
.
mv file30 file-with-long-name; ls
file1 file11 file13 file15 file17 file19 file20 file22 file24 file26 file28 file3 file5 file7 file9
file10 file12 file14 file16 file18 file2 file21 file23 file25 file27 file29 file4 file6 file8 file-with-long-name
ls | cat | column -c $(tput cols)
file1 file14 file19 file23 file28 file6
file10 file15 file2 file24 file29 file7
file11 file16 file20 file25 file3 file8
file12 file17 file21 file26 file4 file9
file13 file18 file22 file27 file5 file-with-long-name
ls
dá 2 linhas. E ls | cat | column -c $(tput cols)
dá 5 linhas.
tput cols
— calcula a largura do terminal. Existe uma alternativa para column
não formatar a largura de todas as colunas de acordo com o nome de arquivo mais longo, mas fará isso como ls
faz?
Pode haver um comando alternativo para ls
obter essa impressão limitando o número máximo de arquivos? (Mas eu também gostaria de ter uma ls
coloração semelhante à dos arquivos.)
Com cada um cd
para outro diretório, quero mostrar automaticamente o conteúdo do diretório atual. Isso pode ser feito colocando ls
uma $PROMPT_COMMAND
variável de ambiente. Mas há um problema com diretórios que contêm muitos arquivos. Eles farão muito barulho/lixo no console. Quero restringi-los para limitar ls
a produção.
Com
zsh
:Listaria os 10 primeiros arquivos (em ordem lexical).
Para os primeiros 10 arquivos
o
ordenados porm
tempo de odificação (com GNUls
, você pode substituir-t
por-U
para pular a classificação por mtime, pois o zsh já os classificou).Veja também
oL
(withls -S
) para ordenar porL
ength (S
ize),n
(com GNUls -v
) para ordemn
numérica (v
ersion),O
em vez deo
para reverter a ordem (withls -r
) e mais. Use[-10,-1]
nos últimos 10.zsh
O builtin doprint
também pode imprimir em colunas com sua-C
opção:Para
print
r
ver4
C
olumns, por exemplo.Ele também possui uma
chpwd
função de gancho (echpwd_functions
array) que é invocada sempre que o diretório de trabalho atual muda (mais versátil que o bash,$PROMPT_COMMAND
cujo equivalente seria aprecmd
função de gancho ou o empacotamento doscd
/pushd
/popd
builtins),então você pode adicionar
~/.zshrc
:Em
bash
(ou deksh93
ondebash
copiou essa sintaxe), você poderia fazer:Então:
bash
não tem qualificadores glob para alterar a ordem das expansões glob, mas a próxima versão 5.3 terá umaGLOBSORT
variável global com a qual você pode alterar a ordem de classificação padrão com a qual você poderá fazer desajeitadamente um subconjunto do que você pode fazer com zsh'soOn^-
eliminatórias globais.Sobre o seu
ls -C | cat
bug , é que a saída não está indo para um terminal, entãols
assume uma largura de exibição de 80 colunas em vez de solicitar a largura do terminal em que exibe sua saída.Você pode ajustar essa largura padrão com a
-w
opção (ls
pelo menos com GNU) ou a$COLUMNS
variável de ambiente (como diz @ChrisDavies , bash¹ como zsh define essa variável automaticamente com base na largura do terminal, mas não a exporta para o ambiente por padrão ).Outros efeitos colaterais da
ls
saída não indo para os terminais são:head
é inválido quando há arquivos que contêm caracteres de nova linha (um desses caracteres de controle).ls
alias que adicione--color=auto
GNUls
não será mais feito.Além disso, se você for usar
head
na saída em colunas, você deve usar-x
(também conhecido--format=across
como GNUls
) em vez de-C
ou não obterá os primeiros arquivos. Então:Para as primeiras 4 linhas da saída de um arquivo
ls
.¹ no caso do bash somente quando interativo
O
bash
shell (e outros) mantém uma variável POSIX chamada$COLUMNS
que representa a largura atualmente conhecida do dispositivo terminal. Quando você executa um comando comols
(implicitamentels -C
), a ferramenta verifica a largura do terminal, se houver, e ajusta o número de colunas de nomes de arquivos para caber na largura disponível. Se a largura não estiver disponível,ls
volte a assumir uma saída padrão com largura de 80 colunas.Quando você executa um pipeline como o
ls -C | head -n4
, porque a$COLUMNS
variável não é exportada, ela fica indisponível para ols
comando. Entãols -C
aqui o padrão é uma saída com largura de 80 colunas.Você pode corrigir isso disponibilizando
$COLUMNS
ols
comando:Exemplo usando uma corrente de dispositivo terminal definida para 132 caracteres de largura
Esteja ciente de que você não pode usar
$COLUMNS
para alterar o número de colunas apresentadas por um simplesls
(ouls -C
). Algumas versões da ferramenta preferem solicitar diretamente ao dispositivo terminal a largura da coluna e somente se isso falhar eles voltam a usar$COLUMNS
.