Existe uma maneira de atualizar dinamicamente o comando less?

141

Eu gosto do watchcomando, mas tem suas limitações .

Estou curioso para saber se eu poderia imitar a funcionalidade de watchwith less. Estou procurando principalmente a capacidade de rolar pelo meu diretório, pois ele é modificado dinamicamente por meio de um script em execução.

Zaid
fonte
Estou procurando tail -f foo.log | grep bare poder alterar dinamicamente o comando grep reiniciando o pipeline tail / grep.
Alexander Mills

Respostas:

119

Em less, você pode digitar Fpara continuar lendo no final de um arquivo (como tail -f); você pode digitar :ee um nome de arquivo para visualizar um arquivo diferente, mas, infelizmente, se você digitar o nome do arquivo atual, lessnão o recarregará. No entanto, há um truque para fazê-lo reler o arquivo atual, sugerido por sabgenton : digite :ee digite o nome de um arquivo inexistente ; isso faz com que menos exiba uma mensagem de erro e recarregue o arquivo atual.

Se você está procurando uma alternativa para watch ls, aqui estão alguns:

  • Os gerenciadores de arquivos modernos (por exemplo, Nautilus, Thunar, Konqueror, Dolphin, Finder) atualizam as visualizações em tempo real.
  • O Emacs não possui atualização em tempo real, mas com auto-revert-modeele recarregará o arquivo ou diretório a cada 5 segundos (o atraso é configurável).
  • Embora o w3m seja principalmente um navegador da web, ele cria um diretório aceitável e um visualizador de arquivos de texto. Pressione Rpara recarregar o URL (local).
Gilles
fonte
6
Para mim: e randomnamejkdlfjldf não carrega o nome do arquivo não-existente, em seguida, recarrega volta para o arquivo atual: D
sabgenton
1
@ sabgenton Obrigado, eu não sabia disso. Esse é um ótimo truque. Adicionei à minha resposta, mas você pode publicá-la como uma resposta sua (que espero que Zaid aceite).
Gilles
1
@CMCDragonkai Não, less +Fapenas observa o conteúdo anexado. Use :e nonexistentfilepara reler a entrada completamente alterada.
Gilles
1
Existe um sinalizador de linha de comando para isso?
precisa saber é o seguinte
3
@PaulWagland Não, Rnão atualiza o arquivo de maneira confiável. Ele atualiza a tela e limpa alguns buffers de entrada, mas na verdade não recarrega os dados do arquivo em todas as circunstâncias (apenas se o arquivo for grande? Eu não procurei profundamente no código).
Gilles
65

Shift+Ffará lesssemelhante a tailf. Ou seja, ele é atualizado se mais dados forem anexados ao arquivo.

balki
fonte
7
Observe que isso funciona apenas para anexos. Se as linhas forem removidas ou editadas no local, lessnão mostrarão essas alterações.
Nathaniel M. Beaver
Como parar o modo de seguir e entrar novamente no modo de rolagem?
Tom Hale
1
<kbd> Ctrl + C </kbd>
mar
1
balki Minha experiência é que isso mata o comando canalizando os dados se você estiver usando $COMMAND | less. Gostaria de saber se existe uma boa maneira de contornar isso? Você pode fazer coisas assim, $COMMAND > /tmp/file & less /tmp/filemas isso não é muito legal.
Att Righ
@AttRigh Eu nunca matei meu comando (no entanto, leio logs de comandos em execução dessa maneira, não canalizo menos, tecnicamente)
jena
41

Basta digitar:

less +F filename

Isso emula pressionando "F" dentro do editor.

jhclark
fonte
1
Obrigado; adicionou o alias alias check="less +F"ao meu .bashrc.
Luke Davis
22

manpáginas podem ser muito informativas. Não se deixe intimidar por eles. Entre tudo, man lessdiz que você pode usar o Rcomando para:

   R      Repaint the screen, discarding any buffered input.  Useful if the file is changing while it is being viewed.

(Sei que essa pergunta tem mais de 6 anos, mas aparece nas pesquisas do Google, por isso não sou a única que clicou no link para chegar até aqui.)

destenson
fonte
7
Isso altera a tela novamente, caso tenha sido interrompida pela saída de outro programa. Ele não recarrega consistentemente o arquivo. Eu não procurei profundamente no código para ver o que ele faz, arquivos experimentalmente curtos não são recarregados. Definitivamente, não sou intimidado pelas páginas de manual e digo que essa descrição é mal formulada: "repintar" não indica que a entrada é relida e o comportamento real não se encaixa "útil se o arquivo estiver sendo alterado" (talvez seja uma bug Eu não sei porque eu não sei o que o comando é suposto fazer) ..?
Gilles
Não sou especialista e também não li o código-fonte de menos, mas o que ele faz é esquecer o que já sabe sobre o arquivo e recarregá-lo, atualizando sua saída com base na entrada que recarrega. A pergunta é: "Existe uma maneira de atualizar dinamicamente o comando less?" Se eu tivesse lido a explicação da pergunta mais detalhadamente antes de responder, talvez eu não tivesse respondido, pois eles continuam dizendo que desejam "rolar pelo meu diretório, pois ele é modificado dinamicamente por meio de um script em execução". menos não seria o comando certo para isso.
destenson
Funciona bem para mim, mesmo ao usar arquivos de 3 bytes. Não consigo imaginar por que não funcionaria para arquivos maiores também.
Addison
1
Ótimo! Para mim, funciona para arquivos curtos e longos. Acabei de perceber dois problemas possíveis: 1. lessnão reabri o arquivo usando seu nome de arquivo - ou seja, quando o inode do arquivo foi alterado (como sobrescrevendo o arquivo usando mv), o conteúdo do arquivo antigo permaneceu (provavelmente o inode antigo foi relido) - - 2. A primeira linha exibida provavelmente começa no mesmo deslocamento de bytes que no conteúdo original do arquivo. Portanto, quando os comprimentos das linhas mudam, a primeira linha exibida pode ficar incompleta e as linhas exibidas podem se mover para cima / baixo.
pabouk 13/09/18
Rnem sempre funciona. Veja unix.stackexchange.com/questions/4351/…
wisbucky 17/04
5

A tecla "F" ao executar lessfará um "follow" semelhante a tail -f, mas não tenho certeza se isso alcançará o que você está procurando aqui.

Dave Jennings
fonte
5

Normalmente, apenas digito Gpara ajustar a saída de uma só vez. Acho especialmente útil em um sistema de arquivos de rede como o CIFS.

jorb
fonte
Esta é mais uma atualização sob demanda do arquivo aberto com menos. Além de pular para o final do arquivo, ele também recarrega o arquivo se ele tiver sido alterado.
jorb
1
Obrigado. Na primeira vez, não foi atualizado para mim, mas agora parece funcionar corretamente. No homem, não está escrito que atualize o arquivo. man less: 'G ou> ou ESC-> Vá para a linha N no arquivo, o padrão é o final do arquivo.' Excluo meus velhos comentários errados aqui, desculpe-os.
Yaroslav Nikitenko
1
BTW, o que você chama de 'base única'? O mantenedor de less, Mark Nudelman, respondeu o seguinte: "Normalmente, o comando G não força uma releitura do arquivo como o comando R. Pode parecer que isso acontece se o final do arquivo ainda não tiver sido lido quando G é chamado, para que o salto para o final do arquivo precise ler os dados lá pela primeira vez.Por exemplo, se você pular para o final com G, depois voltar para o início com 1G, outro programa modifica os dados em o final do arquivo (sem alterar o comprimento) ", (continuação)
Yaroslav Nikitenko
(cont) "então você pula para o final novamente com G, não verá os dados modificados. Mas se você não pular para o final e voltar para o início, na primeira vez em que executar o comando G, ele deverá ser lido os dados lá pela primeira vez e, é claro, verá as modificações que ocorreram desde que menos foram invocadas pela primeira vez. "
Yaroslav Nikitenko
Nesse caso, mencionei que é uma atualização única em oposição a uma atualização dinâmica , que faz parte do que a pergunta original está fazendo.
jorb
1

Você pode usar o vim para ler o arquivo e, em seguida, adicionar o seguinte mapeamento ao seu .vimrcarquivo e pode recarregar facilmente um arquivo com ,r:

let mapleader = ","
nnoremap <leader>r :edit <CR>

Observe que se você já editou o arquivo, o vim irá reclamar. Apenas mude para

let mapleader = ","
nnoremap <leader>r :edit! <CR>

Ignorar mudanças.

puk
fonte
Eles terão que arrancar vimde suas mãos frias e mortas. O contexto da pergunta é sobre less, mas como alguém com tendências monomaníacas , eu simpatizo!
Benjamin R
1

Rpara repintar nem sempre recarrega o arquivo. [1]

Uma solução alternativa que sempre recarrega o arquivo é pressionar hq, que abrirá a página de Ajuda e sairá. Ele tem um efeito colateral de forçar o arquivo a recarregar.


[1] Aqui estão alguns exemplos de situações que Rrecarregam e não recarregam:

  • >e >>alterações: seja recarregado
  • sed -i, gEdit, TextEdit: NÃO seja recarregado
  • No Linux, as vialterações: são recarregadas
  • No Mac, as vialterações: NÃO são recarregadas

Eu acredito que a diferença se resume a saber se o inode muda (você pode verificar com ls -i foo.txt). Se o inode mudar, Rnão funcionará.

wisbucky
fonte
0

Você poderia canalizá-lo para tail -fisso, resultaria em você seguindo a saída. Você estaria perdendo a capacidade de mover (rolar) através de sua saída.

Gert
fonte
0

Se você não tem aversão ao uso de um navegador, pode iniciar o servidor da Web Algernon com este comando:

algernon -a -t /directory/name

Uma lista de arquivos será exibida e atualizada automaticamente em http: // localhost: 3000 /

Alexander
fonte
Thread errado? ..
Tomasz
Parece ser uma maneira de assistir a um diretório, embora ainda esteja longe deless
Jeff Schaller
0

Acabei de encontrar este tópico como qualquer outra pessoa. Gostaria de adicionar a solução de quando você já está no final do arquivo, usar 'g' seguido de 'G' forçará uma atualização do arquivo.

Acabei criando um botão macro para isso no meu programa de terminal (SecureCRT). A macro é simplesmente 'gG'.

ZMitchell
fonte