AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 781136
Accepted
Anton Samokat
Anton Samokat
Asked: 2024-07-31 16:53:50 +0800 CST2024-07-31 16:53:50 +0800 CST 2024-07-31 16:53:50 +0800 CST

Como limitar o número de arquivos impressos por ls e imprimi-los em colunas como ls imprime normalmente?

  • 772

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 lsfaz por padrão.

Eu entendo como limitar o número de arquivos por headcomando, mas não encontrei a solução sobre como imprimir arquivos em colunas da mesma forma que lsfaz por padrão, mas após o processamento através do pipe.

Eu tentei ls -Csinalizar (de man ls:) -C list entries by columnscom tubulação para cat. Mas sua saída difere de lsfora:

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 -Cum bug?

Eu tentei columno 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

lsdá 2 linhas. E ls | cat | column -c $(tput cols)dá 5 linhas. tput cols— calcula a largura do terminal. Existe uma alternativa para columnnão formatar a largura de todas as colunas de acordo com o nome de arquivo mais longo, mas fará isso como lsfaz?

Pode haver um comando alternativo para lsobter essa impressão limitando o número máximo de arquivos? (Mas eu também gostaria de ter uma lscoloração semelhante à dos arquivos.)

Com cada um cdpara outro diretório, quero mostrar automaticamente o conteúdo do diretório atual. Isso pode ser feito colocando lsuma $PROMPT_COMMANDvariá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 lsa produção.

bash
  • 2 2 respostas
  • 389 Views

2 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2024-07-31T17:15:26+08:002024-07-31T17:15:26+08:00

    Com zsh:

    ls -d -- *([1,10])
    

    Listaria os 10 primeiros arquivos (em ordem lexical).

    ls -t -d -- *(om[1,10])
    

    Para os primeiros 10 arquivos oordenados por mtempo de odificação (com GNU ls, você pode substituir -tpor -Upara pular a classificação por mtime, pois o zsh já os classificou).

    Veja também oL(with ls -S) para ordenar por Length ( Size), n(com GNU ls -v) para ordem nnumérica ( version), Oem vez de opara reverter a ordem (with ls -r) e mais. Use [-10,-1]nos últimos 10.

    zshO builtin do printtambém pode imprimir em colunas com sua -Copção:

    print -rC4 -- *([1,10])
    

    Para print rver 4 Columns, por exemplo.

    Ele também possui uma chpwdfunção de gancho (e chpwd_functionsarray) que é invocada sempre que o diretório de trabalho atual muda (mais versátil que o bash, $PROMPT_COMMANDcujo equivalente seria a precmdfunção de gancho ou o empacotamento dos cd/ pushd/ popdbuiltins),

    então você pode adicionar ~/.zshrc:

    list-first-few-files() {
      local files=( *(N) )
      if (( $#files )); then
        ls -dF -- $files[1,10]
        if (( $#files > 10 )) print ... and $(($#files - 10)) more.
      else
        print Directory has no non-hidden files
      fi
    }
    autoload -Uz add-zsh-hook
    add-zsh-hook chpwd list-first-few-files
    

    Em bash(ou de ksh93onde bashcopiou essa sintaxe), você poderia fazer:

    lsn() {
      ls -d -- "${@:2:$1}"
    }
    

    Então:

    lsn 10 *
    

    bashnão tem qualificadores glob para alterar a ordem das expansões glob, mas a próxima versão 5.3 terá uma GLOBSORTvariá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's oOn^-eliminatórias globais.

    Sobre o seu ls -C | cat bug , é que a saída não está indo para um terminal, então lsassume 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 -wopção ( lspelo menos com GNU) ou a $COLUMNSvariá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 lssaída não indo para os terminais são:

    • caracteres de controle não têm mais escape (o que pode ser bastante perigoso com nomes de arquivos maliciosos). Isso também significa que using headé inválido quando há arquivos que contêm caracteres de nova linha (um desses caracteres de controle).
    • colorir se você tiver um lsalias que adicione --color=autoGNU lsnão será mais feito.

    Além disso, se você for usar headna saída em colunas, você deve usar -x(também conhecido --format=acrosscomo GNU ls) em vez de -Cou não obterá os primeiros arquivos. Então:

    ls -w "$COLUMNS" --color=always -xqF | head -n 4
    

    Para as primeiras 4 linhas da saída de um arquivo ls.


    ¹ no caso do bash somente quando interativo

    • 5
  2. Chris Davies
    2024-07-31T17:33:20+08:002024-07-31T17:33:20+08:00

    O bashshell (e outros) mantém uma variável POSIX chamada $COLUMNSque representa a largura atualmente conhecida do dispositivo terminal. Quando você executa um comando como ls(implicitamente ls -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, lsvolte 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 $COLUMNSvariável não é exportada, ela fica indisponível para o lscomando. Então ls -Caqui o padrão é uma saída com largura de 80 colunas.

    Você pode corrigir isso disponibilizando $COLUMNSo lscomando:

    COLUMNS=$COLUMNS ls -C | head -n4
    

    Exemplo usando uma corrente de dispositivo terminal definida para 132 caracteres de largura

    ls -C | head -n1
    file1   file12  file15  file18  file20  file23  file26  file29  file4  file7
    
    COLUMNS=80 ls -C | head -n1
    file1   file12  file15  file18  file20  file23  file26  file29  file4  file7
    
    COLUMNS=132 ls -C | head -n1
    file1   file11  file13  file15  file17  file19  file20  file22  file24  file26  file28  file3   file4  file6  file8
    

    Esteja ciente de que você não pode usar $COLUMNSpara alterar o número de colunas apresentadas por um simples ls(ou ls -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.

    # COLUMNS is ignored for an interactive terminal-based session
    COLUMNS=132 ls -C
    COLUMNS=80 ls -C
    
    • 5

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve