Есть ли способ динамически обновить команду less?


142

Мне нравится watchкоманда, но у нее есть свои ограничения .

Мне любопытно узнать, могу ли я имитировать функциональность watchс less. В основном я ищу возможность прокручивать мой каталог, так как он динамически модифицируется с помощью запущенного скрипта.


Я ищу tail -f foo.log | grep bar, и чтобы иметь возможность динамически изменить команду grep с перезапуском конвейера хвоста / grep.
Александр Миллс

Ответы:


120

В less, вы можете набрать, Fчтобы продолжить чтение в конце файла (например tail -f); Вы можете ввести :eи имя файла для просмотра другого файла, но, к сожалению, если вы введете имя текущего файла, файл lessне будет перезагружен. Однако есть способ заставить его перечитать текущий файл, предложенный sabgenton : введите :eи введите имя несуществующего файла ; Это вызывает меньше, чтобы отобразить сообщение об ошибке, а затем перезагрузить текущий файл.

Если вы ищете альтернативу watch ls, вот несколько:

  • Современные файловые менеджеры (например, Nautilus, Thunar, Konqueror, Dolphin, Finder) обновляют представления в режиме реального времени.
  • Emacs не имеет обновления в реальном времени, но при этом auto-revert-modeон будет перезагружать файл или каталог каждые 5 секунд (задержка настраивается).
  • Хотя w3m - это, прежде всего, веб-браузер, он позволяет просматривать каталоги и просматривать текстовые файлы. Нажмите, Rчтобы перезагрузить (локальный) URL.

6
Для меня: e randomnamejkdlfjldf не может загрузить несуществующее имя файла, а затем перезагружается обратно в текущий файл: D
sabgenton

1
@sabgenton Спасибо, я этого не знал. Это отличный трюк. Я добавил его в свой ответ, но вы можете опубликовать его как собственный ответ (который, я надеюсь, Зайд примет).
Жиль

1
@CMCDragonkai Нет, less +Fтолько часы для добавленного контента. Используйте, :e nonexistentfileчтобы перечитать полностью измененный ввод.
Жиль

1
Для этого есть флаг командной строки?
CMCDragonkai

3
@PaulWagland Нет, Rнадежно не обновлять файл. Он обновляет экран и стирает некоторые входные буферы, но фактически не перезагружает данные из файла при любых обстоятельствах (только если файл большой? Я не углублялся в код).
Жиль

66

Shift+Fсделает lessаналогично tailf. То есть он обновляется, если к файлу добавляются дополнительные данные.


7
Обратите внимание, что это работает только для добавления. Если строки удаляются или редактируются на месте, lessэти изменения не отображаются.
Натаниэль М. Бивер

Как мне прекратить следующий режим и снова войти в режим прокрутки?
Том Хейл,

1
<kbd> Ctrl + C </ kbd>
балки

1
balki Мой опыт показывает, что это убивает команду, передающую данные, если вы используете $COMMAND | less. Интересно, есть ли хороший способ обойти это? Вы можете делать такие вещи, как, $COMMAND > /tmp/file & less /tmp/fileно это не очень приятно.
Att Righ

@AttRigh Я никогда не убивал свою команду (однако я так читаю логи запущенных команд, технически я не использую меньше)
Джена

42

Просто введите:

less +F filename

Это эмулирует нажатие «F» в редакторе.


1
Спасибо; добавил псевдоним alias check="less +F"к моему .bashrc.
Люк Дэвис

23

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
Это перерисовывает экран в случае, если он был нарушен выходом из другой программы. Он не постоянно перезагружает файл. Я не углубился в код, чтобы увидеть, что он делает, экспериментально короткие файлы не перезагружаются. Я определенно не запуган man-страницами, и я говорю, что это описание плохо сформулировано: «перекрасить» не означает, что ввод перечитывается, и реальное поведение не совсем подходит «полезно, если файл меняется» (возможно, это ошибка? Я не знаю, так как я не знаю, что должна делать команда) ..
Жиль

Я не эксперт и тоже не читал исходный код Меньше, но что он делает, так это забывает, что он уже знает о файле, и перезагружает его, обновляя его вывод на основе данных, которые он перезагружает. Вопрос звучит так: «Есть ли способ динамически обновить команду less?» Если бы я прочитал объяснение вопроса более тщательно, прежде чем ответить, я бы не ответил, так как они продолжают говорить, что хотят «прокрутить мой каталог, поскольку он динамически изменяется с помощью запущенного сценария». меньше не будет правильной командой для этого.
Дестенсон

У меня отлично работает, даже при использовании файлов длиной 3 байта. Я не могу представить, почему это не будет работать для больших файлов тоже.
Addison

1
Большой! Для меня это работает как для коротких, так и для длинных файлов. Я только что заметил две возможные проблемы: 1. lessне открывал файл заново, используя его имя файла - то есть, когда изменялся индекс файла (как при перезаписи файла с использованием mv), то содержимое старого файла оставалось (вероятно, старый индекс был перечитан) - - 2. Первая отображаемая строка, вероятно, начинается с того же байтового смещения, что и в исходном содержимом файла. Таким образом, при изменении длины строки первая отображаемая строка может быть неполной, и отображаемые строки могут перемещаться вверх / вниз.
Пабук

Rне всегда работает См. Unix.stackexchange.com/questions/4351/…
wisbucky

5

Клавиша «F» во время работы lessбудет выполнять «следовать», как tail -f, но я не уверен, что это даст то, что вы ищете здесь.


5

Я обычно просто Gпечатаю вывод на разовой основе. Я считаю это особенно полезным в сетевой файловой системе, такой как CIFS.


Это больше по требованию обновления файла, открытого с меньшими затратами. Помимо перехода к концу файла, он также перезагружает файл, если он изменился.
Джорб

1
Благодарю. В первый раз это не освежило для меня, но теперь, кажется, работает правильно. В мужчине не написано, что обновляет файл. man less: 'G или> или ESC-> Перейти к строке N в файле, по умолчанию конец файла.' Я удаляю свои старые неправильные комментарии здесь, извините за них.
Ярослав Никитенко

1
Кстати, что вы называете «разовой основой»? Сопровождающий lessМарк Нудельман ответил следующее: «Команда G обычно не вызывает повторное чтение файла, как это делает команда R. Может показаться, что это происходит, если конец файла еще не прочитан, когда G вызывается, так что переход к концу файла должен прочитать данные там в первый раз. Например, если вы переходите к концу с помощью G, а затем переходите к началу с 1G, тогда другая программа изменяет данные в конец файла (без изменения длины) "(продолжение)
Ярослав Никитенко

(продолжение) "затем вы снова переходите к концу с помощью G, вы не увидите измененные данные. Но если вы не перейдете к концу и не вернетесь к началу, то при первом выполнении команды G она должна прочитать данные там в первый раз, и, конечно, он увидит любые изменения, которые произошли с тех пор, как было вызвано меньше. "
Ярослав Никитенко

В этом случае я упомянул, что это одноразовое обновление, а не динамическое обновление, которое является частью того, что задает оригинальный вопрос.
Джорб

1

Вы можете использовать vim, чтобы прочитать файл, затем добавить следующее сопоставление в ваш .vimrcфайл, и вы можете легко перезагрузить файл с ,r:

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

Обратите внимание, что если вы уже отредактировали файл, vim будет жаловаться. Просто измените на

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

Игнорировать изменения.


Им придется вырвать vimиз твоих холодных мертвых рук. Контекст вопроса примерно такой less, но я, как человек с мономаниакальными тенденциями, сочувствую!
Бенджамин Р

1

Rдля перекраски не всегда перезагрузить файл. [1]

Обходной путь, который всегда перезагружает файл, состоит в том hq, чтобы нажать , который откроет страницу справки, затем выйдет. У него есть побочный эффект, заставляющий файл перезагрузиться.


[1] Вот несколько примеров ситуаций, которые Rделают и не перезагружаются:

  • >и >>изменения: перезагружаются
  • sed -i, gEdit, TextEdit: НЕ перезагружаться
  • В Linux viизменения: перезагружаются
  • На Mac viизменения: НЕ перезагружаться

Я считаю, что разница сводится к тому, изменяется ли индекс (вы можете проверить с помощью ls -i foo.txt). Если индекс изменяется, то Rработать не будет.


0

tail -fВместо этого вы можете передать его по конвейеру , это приведет к тому , что вы последуете выводу. Вы бы потеряли способность перемещаться (прокручиваться) через ваш вывод, хотя.


0

Если вы не против использования браузера, вы можете запустить веб-сервер Algernon с помощью этой команды:

algernon -a -t /directory/name

Список файлов будет отображаться и автоматически обновляться по адресу http: // localhost: 3000 /.


Неверная тема? ..
Томаш

Кажется, это способ посмотреть каталог, хотя до него далекоless
Джефф Шаллер

0

Я просто нашел эту тему, как и все остальные. Я хотел бы добавить решение, когда вы уже находитесь в конце файла, использование «g» и «G» приведут к обновлению файла.

Я закончил тем, что сделал макро кнопку для этого в моей терминальной программе (SecureCRT). Макрос просто «gG».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.