Gibt es eine Möglichkeit, den Befehl less dynamisch zu aktualisieren?

141

Ich mag den watchBefehl, aber er hat seine Grenzen .

Ich bin gespannt, ob ich die Funktionalität von watchmit nachahmen könnte less. Ich suche hauptsächlich nach der Möglichkeit, durch mein Verzeichnis zu scrollen, da es über ein laufendes Skript dynamisch geändert wird.

Zaid
quelle
Ich suche tail -f foo.log | grep barund in der Lage zu sein, den grep-Befehl mit dem Neustart der tail / grep-Pipeline dynamisch zu ändern.
Alexander Mills

Antworten:

119

In lesskönnen Sie eingeben F, um das Lesen am Ende einer Datei fortzusetzen (wie tail -f); Sie können :eeinen Dateinamen eingeben, um eine andere Datei anzuzeigen. Wenn Sie jedoch den Namen der aktuellen Datei eingeben, wird die Datei leider lessnicht erneut geladen. Allerdings gibt es einen Trick , um es zu machen , die aktuelle Datei erneut zu lesen, vorgeschlagen von sabgenton : Art :eund geben Sie den Namen einer nicht existierenden Datei ; Dadurch wird weniger veranlasst, eine Fehlermeldung anzuzeigen und anschließend die aktuelle Datei neu zu laden.

Wenn Sie nach einer Alternative suchen watch ls, sind hier einige:

  • Moderne Dateimanager (z. B. Nautilus, Thunar, Konqueror, Dolphin, Finder) aktualisieren Ansichten in Echtzeit.
  • Emacs hat keine Echtzeitaktualisierung, aber mit auto-revert-modewird die Datei oder das Verzeichnis alle 5 Sekunden neu geladen (die Verzögerung ist konfigurierbar).
  • Obwohl w3m in erster Linie ein Webbrowser ist, ist es ein passabler Viewer für Verzeichnisse und Textdateien. Drücken Sie R, um die (lokale) URL neu zu laden.
Gilles
quelle
6
Für mich: e randomnamejkdlfjldf kann den nicht vorhandenen Dateinamen nicht laden und lädt ihn dann zurück in die aktuelle Datei: D
sabgenton
1
@sabgenton Danke, das wusste ich nicht. Das ist ein toller Trick. Ich habe es zu meiner Antwort hinzugefügt, aber Sie können es als Ihre eigene Antwort posten (was Zaid hoffentlich akzeptieren würde).
Gilles
1
@CMCDragonkai Nein, es wird less +Fnur nach angehängten Inhalten gesucht . Verwenden Sie :e nonexistentfilediese Taste, um vollständig geänderte Eingaben erneut zu lesen.
Gilles
1
Gibt es dafür ein Kommandozeilen-Flag?
CMCDragonkai
3
@PaulWagland Nein, Rdie Datei wird nicht zuverlässig aktualisiert . Es aktualisiert den Bildschirm und löscht einige Eingabepuffer, lädt jedoch nicht unter allen Umständen Daten aus der Datei neu (nur wenn die Datei groß ist? Ich habe mich nicht tief in den Code vertieft).
Gilles
65

Shift+Fwerde lessähnlich machen wie tailf. Das heißt, es wird aktualisiert, wenn mehr Daten an die Datei angehängt werden.

balki
quelle
7
Beachten Sie, dass dies nur für Anhänge funktioniert. Wenn Linien entfernt oder direkt bearbeitet werden, lesswerden diese Änderungen nicht angezeigt.
Nathaniel M. Beaver
Wie beende ich den Verfolgungsmodus und wechsle wieder in den Bildlaufmodus?
Tom Hale
1
<kbd> Strg + C </ kbd>
balki
1
Meine Erfahrung ist, dass dies den Befehl beendet, der die Daten weiterleitet, wenn Sie verwenden $COMMAND | less. Ich frage mich, ob es einen schönen Weg gibt, dies zu umgehen. Sie können Sachen wie machen, $COMMAND > /tmp/file & less /tmp/fileaber das ist nicht sehr schön.
Att Righ
@AttRigh Ich habe meinen Befehl nie getötet (aber ich lese die Protokolle der ausgeführten Befehle auf diese Weise, technisch gesehen nicht weniger)
jena
41

Einfach eintippen:

less +F filename

Dies emuliert das Drücken von "F" im Editor.

jhclark
quelle
1
Vielen Dank; hat den Alias alias check="less +F"zu my hinzugefügt .bashrc.
Luke Davis
22

manSeiten können sehr informativ sein. Lass dich von ihnen nicht einschüchtern. Unter anderem man lessheißt es , dass Sie den RBefehl verwenden können, um:

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

(Mir ist klar, dass diese Frage älter als 6 Jahre ist, aber sie taucht bei Google Search auf. Daher bin ich nicht der einzige, der auf den Link geklickt hat, um hierher zu gelangen.)

Destenson
quelle
7
Dadurch wird der Bildschirm neu gezeichnet, falls er durch die Ausgabe eines anderen Programms gestört wurde. Die Datei wird nicht konsistent neu geladen. Ich habe mich nicht tief in den Code vertieft, um zu sehen, was er tut. Experimentell werden kurze Dateien nicht neu geladen. Ich bin definitiv nicht von Manpages eingeschüchtert und ich sage, diese Beschreibung ist schlecht formuliert: "repaint" vermittelt nicht, dass Eingaben erneut gelesen werden, und das tatsächliche Verhalten passt nicht ganz zu "nützlich, wenn sich die Datei ändert" (vielleicht ist es eine Ich weiß nicht, da ich nicht weiß, was der Befehl tun soll.)
Gilles
Ich bin kein Experte und habe auch den Quellcode von less nicht gelesen, aber es wird vergessen, was es bereits über die Datei weiß und lädt sie neu. Die Ausgabe wird basierend auf der neu geladenen Eingabe aktualisiert. Die Frage lautet "Gibt es eine Möglichkeit, den Befehl less dynamisch zu aktualisieren?" Wenn ich die Erklärung der Frage vor der Beantwortung gründlicher gelesen hätte, hätte ich sie möglicherweise nicht beantwortet, da sie sagen, sie möchten "durch mein Verzeichnis scrollen, während es über ein laufendes Skript dynamisch geändert wird". weniger wäre nicht der richtige Befehl dafür.
Destenson
Funktioniert einwandfrei, auch wenn Dateien mit einer Länge von 3 Byte verwendet werden. Ich kann mir nicht vorstellen, warum es auch bei größeren Dateien nicht funktioniert.
Addison
1
Toll! Bei mir funktioniert es sowohl für kurze als auch für lange Dateien. Ich habe gerade zwei mögliche Probleme bemerkt: 1. Ich lesshabe die Datei nicht mit ihrem Dateinamen erneut geöffnet - dh als sich der Inode der Datei änderte (wie beim Überschreiben der Datei mit mv), blieb der alte Dateiinhalt erhalten (wahrscheinlich wurde der alte Inode erneut gelesen) - - 2. Die erste angezeigte Zeile beginnt wahrscheinlich mit demselben Byte-Versatz wie im ursprünglichen Dateiinhalt. Wenn sich die Zeilenlängen ändern, kann die erste angezeigte Zeile unvollständig sein und die angezeigten Zeilen können sich nach oben / unten bewegen.
Pabouk
Rfunktioniert nicht immer. Siehe unix.stackexchange.com/questions/4351/…
wisbucky
5

Die "F" -Taste beim Laufen lessführt zu einem "Folgen" ähnlich dem tail -f, aber ich bin nicht sicher, ob dies das erreichen wird, wonach Sie hier suchen.

Dave Jennings
quelle
5

Normalerweise schreibe ich nur, Gum die Ausgabe einmalig zu beenden. Ich finde es besonders hilfreich über ein Netzwerk-Dateisystem wie CIFS.

jorb
quelle
Dies ist eher eine On-Demand-Aktualisierung der mit weniger geöffneten Datei. Zusätzlich zum Springen zum Ende der Datei wird auch die Datei neu geladen, wenn sie geändert wurde.
Jorb
1
Vielen Dank. Das erste Mal wurde es nicht aktualisiert, aber jetzt scheint es richtig zu funktionieren. Bei dem Mann steht nicht geschrieben, dass er die Datei aktualisiert. man less: 'G oder> oder ESC-> Gehe zu Zeile N in der Datei, Standard das Ende der Datei.' Ich lösche meine alten falschen Kommentare hier, sorry für sie.
Jaroslaw Nikitenko
1
Übrigens, wie nennt man eine "einmalige Basis"? Der Betreuer von less, Mark Nudelman, antwortete wie folgt: "Der Befehl G erzwingt normalerweise kein erneutes Lesen der Datei wie der Befehl R. Dies kann möglicherweise der Fall sein, wenn das Ende der Datei bei G noch nicht gelesen wurde wird aufgerufen, so dass das Springen zum Ende der Datei die Daten dort zum ersten Mal lesen muss. Wenn Sie zum Beispiel mit G zum Ende springen, dann mit 1G zum Anfang zurückspringen, dann ändert ein anderes Programm die Daten an das Ende der Datei (ohne die Länge zu ändern) "(Forts.)
Yaroslav Nikitenko
(Forts.) "Wenn Sie dann mit G erneut zum Ende springen, werden die geänderten Daten nicht angezeigt. Wenn Sie jedoch nicht zum Ende und zurück zum Anfang springen, muss der Befehl G beim ersten Ausführen gelesen werden die Daten dort zum ersten Mal, und natürlich werden alle Änderungen angezeigt, die seit dem ersten Aufruf von less stattgefunden haben. "
Yaroslav Nikitenko
In diesem Fall habe ich erwähnt, dass es sich um eine einmalige Aktualisierung im Gegensatz zu einer dynamischen Aktualisierung handelt, die Teil der ursprünglichen Frage ist.
Jorb
1

Sie können vim verwenden, um die Datei zu lesen, und dann die folgende Zuordnung zu Ihrer .vimrcDatei hinzufügen, und Sie können eine Datei einfach mit neu laden ,r:

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

Beachten Sie, dass sich vim beschwert, wenn Sie die Datei bereits bearbeitet haben. Wechseln Sie einfach zu

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

Änderungen ignorieren.

puk
quelle
Sie müssen vimdeine kalten, toten Hände loswerden . Der Kontext der Frage ist ungefähr less, aber als jemand mit monomanischen Tendenzen sympathisiere ich!
Benjamin R
1

Rfor repaint lädt die Datei nicht immer neu. [1]

Eine Problemumgehung, mit der die Datei immer neu geladen wird, besteht darin, auf zu drücken hq, die Hilfeseite zu öffnen und dann zu beenden. Dies hat den Nebeneffekt, dass die Datei neu geladen werden muss.


[1] Hier sind einige Beispiele für Situationen, in denen ein RReload durchgeführt und nicht durchgeführt wird:

  • >und >>Änderungen: DO get reloaded
  • sed -i, gEdit, TextEdit: NICHT neu geladen werden
  • viÄnderungen unter Linux : DO get reloaded
  • viÄnderungen auf dem Mac : NICHT neu laden

Ich glaube, der Unterschied hängt davon ab, ob sich die Inode ändert (das können Sie überprüfen ls -i foo.txt). Wenn sich der Inode ändert, Rfunktioniert das nicht.

weises Glück
quelle
0

Du tail -fkönntest es stattdessen weiterleiten, es würde dazu führen, dass du der Ausgabe folgst. Sie verlieren jedoch die Fähigkeit, sich durch Ihre Ausgabe zu bewegen (zu scrollen).

Gert
quelle
0

Wenn Sie nicht abgeneigt sind, einen Browser zu verwenden, können Sie den Algernon -Webserver mit folgendem Befehl starten :

algernon -a -t /directory/name

Eine Liste der Dateien wird dann unter http: // localhost: 3000 / angezeigt und automatisch aktualisiert .

Alexander
quelle
Falscher Thread? ..
Tomasz
Es scheint ein Weg zu sein, ein Verzeichnis zu sehen, obwohl es ein langer Weg ist vonless
Jeff Schaller
0

Ich habe gerade diesen Thread wie jeder andere gefunden. Ich möchte die Lösung hinzufügen, wenn Sie sich bereits am Ende der Datei befinden. Wenn Sie 'g' gefolgt von 'G' verwenden, wird eine Aktualisierung der Datei erzwungen.

Am Ende habe ich in meinem Terminalprogramm (SecureCRT) eine Makrotaste dafür erstellt. Das Makro ist einfach 'gG'.

ZMitchell
quelle