有没有一种方法可以动态刷新less命令?


141

我喜欢该watch命令,但是它有其局限性

我很好奇我是否可以模仿watchwith 的功能less。我主要是在寻找能够通过运行脚本动态修改目录的能力。


我在寻找tail -f foo.log | grep bar,并能够通过重新启动tail / grep管道来动态更改grep命令。
亚历山大·米尔斯

Answers:


119

在中less,您可以输入F以继续读取文件的末尾(如tail -f);您可以输入:e和文件名来查看其他文件,但是不幸的是,如果输入当前文件的名称,less则不会重新加载该文件。但是,有一个技巧可以使它重新读取当前文件,这由sabgenton建议:输入:e并输入不存在的文件的名称;导致较少显示错误消息,然后重新加载当前文件。

如果您正在寻找的替代方案watch ls,请参考以下几种:

  • 现代文件管理器(例如Nautilus,Thunar,Konqueror,Dolphin,Finder)实时刷新视图。
  • Emacs没有实时刷新,但是使用时auto-revert-mode,它将每5秒重新加载文件或目录(延迟是可配置的)。
  • 尽管w3m主要是Web浏览器,但它使目录和文本文件查看器成为可传递的目录。按下R以重新加载(本地)URL。

6
对我来说:e randomnamejkdlfjldf无法加载不存在的文件名,然后重新加载回当前文件:D
sabgenton

1
@sabgenton谢谢,我不知道。真是个绝招。我将其添加到我的答案中,但是您可以将其发布为自己的答案(我希望Zaid可以接受)。
吉尔斯

1
@CMCDragonkai不,less +F仅监视附加内容。使用:e nonexistentfile重读彻底改变输入。
吉尔斯

1
有命令行标记吗?
CMCDragonkai '16

3
@PaulWagland不,R不能可靠地刷新文件。它刷新了屏幕,并擦除了一些输入缓冲区,但实际上并不能在所有情况下都从文件中重新加载数据(仅当文件很大时?我没有深入研究代码)。
吉尔斯

65

Shift+F将使less类似于tailf。也就是说,如果将更多数据附加到文件,它将刷新。


7
请注意,这适用于追加。如果线被删除或就地编辑,less则不会显示这些更改。
纳撒尼尔·比弗

如何停止跟随模式并重新进入滚动模式?
汤姆·黑尔

1
<kbd> Ctrl + C </ kbd>
巴尔基

1
balki我的经验是,如果您正在使用,这会杀死传递数据的命令$COMMAND | less。我想知道是否有解决这个问题的好方法?您可以做类似的事情,$COMMAND > /tmp/file & less /tmp/file但这不是很好。
Att Righ

@AttRigh我从来没有杀死过我的命令(但是我以这种方式读取正在运行的命令的日志,从技术上讲,我不会减少内容)
耶拿

41

只需键入:

less +F filename

模拟在编辑器中按“ F”。


1
谢谢; 已将别名添加alias check="less +F"到我的中.bashrc
路加·戴维斯

22

man页面可以提供很多信息。不要被他们吓倒。除此之外,man less您还可以使用R命令执行以下操作:

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

(我知道这个问题已有6年之久了,但是它出现在Google搜索中,所以我不是唯一一个单击链接到达此处的人。)


7
万一被另一个程序的输出打乱了屏幕,它会重新绘制屏幕。它不会一致地重新加载文件。我没有深入研究代码以了解其作用,实验上较短的文件不会重新加载。我绝对不会被手册页所吓倒,我说的描述措辞很差:“重新绘制”并不表示输入已被重新读取,并且实际行为并不完全适合“如果文件正在更改”(可能是bug?我不知道,因为我不知道命令应该执行的操作)
Gilles

我不是专家,也没有读过更少的源代码,但是这样做是忘记了它已经知道的关于文件的知识并重新加载它,并根据重新加载的输入刷新其输出。问题显示为“是否有办法动态刷新less命令?” 如果在回答之前我已经更彻底地阅读了问题的解释,那么我可能还没有回答,因为他们继续说,他们希望“滚动浏览我的目录,因为它是通过正在运行的脚本动态修改的”。少了不是正确的命令。
destenson

即使使用3字节长的文件,对我来说也很好用。我无法想象为什么它也不适用于较大的文件。
艾迪生

1
大!对我来说,它适用于长文件和短文件。我只是注意到了两个可能的问题:1. less没有使用文件名重新打开文件-即,当文件的inode更改时(例如,使用覆盖文件mv),则旧文件内容保持不变(可能是重新读取了旧的inode)- -2.显示的第一行可能开始于与原始文件内容相同的字节偏移量。因此,当行长更改时,第一条显示的行可能不完整,并且显示的行可能会上下移动。
pabouk


5

运行时,“ F”键less会执行与相似的“跟随”操作tail -f,但是我不确定这是否可以实现您在此处查找的功能。


5

我通常只输入一次G即可尾随输出。我发现它在像CIFS这样的网络文件系统上特别有用。


这更多地是按需刷新的文件,打开时所花费的时间更少。除了跳转到文件末尾之外,如果文件已更改,它还会重新加载文件。
jorb

1
谢谢。第一次对我来说并没有刷新,但现在看来可以正常工作。在这个人中,没有刷新文件的记录。man less:'G或>或ESC->转到文件中的N行,默认为文件末尾。我在这里删除了我以前的错误评论,对不起。
Yaroslav Nikitenko

1
顺便说一句,您怎么称呼“一次性”?的维护者lessMark Nudelman回答:“ G命令通常不像R命令那样强制重新读取文件。如果在G时尚未读取文件末尾,似乎可以这样做。会被调用,因此跳转到文件末尾必须是第一次从那里读取数据,例如,如果跳转到G末尾,然后又跳回到1G开头,那么另一个程序将修改该数据文件末尾(不更改长度),“(续)
Yaroslav Nikitenko

(续)“然后,您再次使用G跳到末尾,您将看不到修改后的数据。但是,如果您没有跳到末尾并回到开头,那么第一次执行G命令​​时,它必须读取那里的数据是第一次,当然,它将看到自第一次调用less以来发生的任何修改。”
Yaroslav Nikitenko

在这种情况下,我提到这是一次刷新,而不是动态刷新,这是原始问题的一部分。
jorb

1

您可以使用vim读取文件,然后将以下映射添加到.vimrc文件中,并且可以使用以下命令轻松地重新加载文件,r

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

注意,如果您已经编辑了文件,vim将会抱怨。只需更改为

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

忽略更改。


他们将不得不vim从您冰冷而死的手中撬开。问题的内容是关于less,但作为一个我自己患有单躁狂倾向的人,我表示同情!
本杰明·R

1

R对于重画并不总是重新加载文件。[1]

始终重新加载文件的解决方法是按hq,这将打开“帮助”页面,然后退出。它具有强制重新加载文件的副作用。


[1]以下是一些R可以重新加载或不重新加载的情况的示例:

  • >>>更改:必须重新加载
  • sed -i,gEdit,TextEdit:请勿重新加载
  • 在Linux上,vi更改:请重新加载
  • 在Mac上,vi更改:请勿重新加载

我相信差异归结于inode是否更改(可以使用进行检查ls -i foo.txt)。如果inode更改,R则将无法正常工作。


0

您可以通过管道将其传输到tail -f,这将导致您关注输出。但是,您将失去在输出中移动(滚动)的功能。



0

我只是像其他人一样发现了这个线程。我想添加一个解决方案,当您已经在文件末尾时,使用'g'后面加上'G'将强制刷新文件。

我最终在终端程序(SecureCRT)中为此做了一个宏按钮。宏就是“ gG”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.