¿Hay alguna manera de actualizar dinámicamente el comando less?


142

Me gusta el watchcomando, pero tiene sus limitaciones .

Tengo curiosidad por saber si podría imitar la funcionalidad de watchcon less. Estoy buscando principalmente la capacidad de desplazarme por mi directorio, ya que se modifica dinámicamente a través de un script en ejecución.


Estoy buscando tail -f foo.log | grep bary poder cambiar dinámicamente el comando grep al reiniciar la tubería de cola / grep.
Alexander Mills el

Respuestas:


120

En less, puede escribir Fpara seguir leyendo al final de un archivo (como tail -f); puede escribir :ey un nombre de archivo para ver un archivo diferente, pero desafortunadamente, si ingresa el nombre del archivo actual, lessno vuelve a cargar el archivo. Sin embargo, hay un truco para que vuelva a leer el archivo actual, sugerido por sabgenton : escriba :ee ingrese el nombre de un archivo inexistente ; eso hace que menos muestre un mensaje de error y luego vuelva a cargar el archivo actual.

Si está buscando una alternativa a watch ls, aquí hay algunos:

  • Los administradores de archivos modernos (por ejemplo, Nautilus, Thunar, Konqueror, Dolphin, Finder) actualizan las vistas en tiempo real.
  • Emacs no tiene actualización en tiempo real, pero con auto-revert-mode, volverá a cargar el archivo o directorio cada 5 segundos (el retraso es configurable).
  • Aunque w3m es principalmente un navegador web, crea un directorio transitable y un visor de archivos de texto. Presione Rpara volver a cargar la URL (local).

66
Para mí: e randomnamejkdlfjldf no puede cargar el nombre de archivo inexistente y luego se vuelve a cargar en el archivo actual: D
sabgenton

1
@sabgenton Gracias, no lo sabía. Ese es un gran truco. Lo agregué a mi respuesta, pero puedes publicarlo como respuesta propia (que espero que Zaid acepte).
Gilles

1
@CMCDragonkai No, less +Fsolo observa el contenido adjunto. Use :e nonexistentfilepara volver a leer la entrada completamente cambiada.
Gilles

1
¿Hay una bandera de línea de comando para eso?
CMCDragonkai

3
@PaulWagland No, Rno actualiza de manera confiable el archivo. Actualiza la pantalla y borra algunos búferes de entrada, pero en realidad no recarga los datos del archivo en todas las circunstancias (¿solo si el archivo es grande? No profundicé en el código).
Gilles

66

Shift+Fhará lesssimilar a tailf. Es decir, se actualiza si se agregan más datos al archivo.


77
Tenga en cuenta que esto solo funciona para anexos. Si las líneas se eliminan o editan in situ, lessno se mostrarán esos cambios.
Nathaniel M. Beaver

¿Cómo detengo el modo siguiente y vuelvo a ingresar al modo desplazable?
Tom Hale

1
<kbd> Ctrl + C </kbd>
balki

1
balki Mi experiencia es que esto mata el comando que canaliza los datos si está utilizando $COMMAND | less. Me pregunto si hay una buena manera de evitar esto. Puedes hacer cosas como, $COMMAND > /tmp/file & less /tmp/filepero eso no es muy agradable.
Att Righ

@AttRigh Nunca eliminé mi comando (sin embargo, leo los registros de los comandos en ejecución de esta manera, técnicamente no canalizo menos)
jena

42

Simplemente escriba:

less +F filename

Esto emula presionar "F" dentro del editor.


1
Gracias; agregó el alias alias check="less +F"a mi .bashrc.
Luke Davis el

23

manLas páginas pueden ser muy informativas. No te dejes intimidar por ellos. Entre todo lo demás, man lessdice que puede usar el Rcomando para:

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

(Me doy cuenta de que esta pregunta tiene más de 6 años, pero aparece en las búsquedas de Google, así que no soy el único que hizo clic en el enlace para llegar aquí).


77
Esto vuelve a pintar la pantalla en caso de que fuera interrumpida por la salida de otro programa. No recarga constantemente el archivo. No he profundizado en el código para ver qué hace, los archivos cortos experimentales no se vuelven a cargar. Definitivamente no estoy intimidado por las páginas de manual y digo que esta descripción está mal redactada: "repintar" no transmite que la entrada se vuelve a leer, y el comportamiento real no encaja "útil si el archivo está cambiando" (tal vez es un error? No lo sé ya que no sé qué se supone que debe hacer el comando) ..
Gilles

No soy un experto, y tampoco he leído el código fuente de menos, pero lo que hace es olvidar lo que ya sabe sobre el archivo y volver a cargarlo, actualizando su salida en función de la entrada que vuelve a cargar. La pregunta dice "¿Hay alguna manera de actualizar dinámicamente el comando less?" Si hubiera leído la explicación de la pregunta más a fondo antes de responder, podría no haber respondido, ya que continúan diciendo que quieren "desplazarse por mi directorio a medida que se modifica dinámicamente a través de un script en ejecución". menos no sería el comando correcto para eso.
destenson

Funciona bien para mí, incluso cuando utilizo archivos de 3 bytes de longitud. No puedo imaginar por qué no funcionaría para archivos más grandes también.
Addison

1
¡Excelente! Para mí funciona para archivos cortos y largos. Acabo de notar dos posibles problemas: 1. lessno volvió a abrir el archivo usando su nombre de archivo, es decir, cuando el inodo del archivo cambió (como al sobrescribir el archivo usando mv), el contenido del archivo anterior permaneció (probablemente el inodo anterior se volvió a leer) - - 2. La primera línea que se muestra probablemente comienza en el mismo desplazamiento de bytes que en el contenido del archivo original. Entonces, cuando cambian las longitudes de línea, la primera línea mostrada podría estar incompleta y las líneas mostradas podrían moverse hacia arriba / abajo.
pabouk


5

La tecla "F" cuando se ejecuta lesshará un "seguimiento" similar a tail -f, pero no estoy seguro de si eso logrará lo que está buscando aquí.


5

Normalmente solo escribo Gpara ajustar la salida una vez. Me resulta especialmente útil en un sistema de archivos de red como CIFS.


Esto es más una actualización a pedido del archivo abierto con menos. Además de saltar al final del archivo, también vuelve a cargar el archivo si ha cambiado.
jorb

1
Gracias. La primera vez no se actualizó para mí, pero ahora parece funcionar correctamente. En el hombre no está escrito que actualice el archivo. man less: 'G o> o ESC-> Ir a la línea N en el archivo, predeterminado al final del archivo'. Borro mis viejos comentarios incorrectos aquí, perdón por ellos.
Yaroslav Nikitenko

1
Por cierto, ¿cómo se llama 'una vez'? El responsable de mantenimiento less, Mark Nudelman, respondió lo siguiente: "El comando G normalmente no fuerza una relectura del archivo como lo hace el comando R. Puede parecer que si el final del archivo aún no se ha leído cuando G se invoca, de modo que saltar al final del archivo debe leer los datos allí por primera vez. Por ejemplo, si salta al final con G, luego vuelve al principio con 1G, luego otro programa modifica los datos en al final del archivo (sin cambiar la longitud), "(cont.)
Yaroslav Nikitenko

(cont) "luego saltas al final nuevamente con G, no verás los datos modificados. Pero si no saltas al final y vuelves al principio, entonces la primera vez que ejecutas el comando G debe leer los datos allí por primera vez, y por supuesto verá cualquier modificación que haya sucedido desde que se invocó por primera vez menos ".
Yaroslav Nikitenko

En este caso, mencioné que se trata de una actualización única en lugar de una actualización dinámica , que es parte de lo que la pregunta original está haciendo.
jorb

1

Puede usar vim para leer el archivo, luego agregar la siguiente asignación a su .vimrcarchivo y puede volver a cargar fácilmente un archivo con ,r:

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

Tenga en cuenta que si ya editó el archivo, vim se quejará. Solo cambia a

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

Ignorar los cambios.


Tendrán que sacarte vimde tus manos frías y muertas. El contexto de la pregunta es sobre less, pero como alguien con tendencias monomaníacas , ¡simpatizo!
Benjamin R

1

Rpara repintar no siempre vuelve a cargar el archivo. [1]

Una solución alternativa que siempre vuelve a cargar el archivo es presionar hq, que abrirá la página de Ayuda y luego se cerrará. Tiene un efecto secundario de forzar la recarga del archivo.


[1] Aquí hay algunos ejemplos de situaciones que Rse recargan y no se recargan:

  • >y >>cambios: SÍ recarga
  • sed -i, gEdit, TextEdit: NO se recargue
  • En Linux, vicambios: SÍ recarga
  • En Mac, vicambios: NO se recargue

Creo que la diferencia se reduce a si el inodo cambia (puede consultar con ls -i foo.txt). Si el inodo cambia, entonces Rno funcionará.


0

En su tail -flugar, podría canalizarlo , resultaría en que siga la salida. Sin embargo, estaría perdiendo la capacidad de moverse (desplazarse) a través de su salida.


0

Si no es reacio a usar un navegador, puede iniciar el servidor web Algernon con este comando:

algernon -a -t /directory/name

Luego se mostrará una lista de archivos, y se actualizará automáticamente, en http: // localhost: 3000 /


Hilo incorrecto? ..
Tomasz

Parece ser una forma de ver un directorio, aunque está muy lejos deless
Jeff Schaller

0

Acabo de encontrar este hilo como cualquier otra persona. Me gustaría agregar la solución de cuando ya está al final del archivo, usando 'g' seguido de 'G' forzará una actualización del archivo.

Terminé haciendo un botón de macro para esto en mi programa de terminal (SecureCRT). La macro es simplemente 'gG'.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.