lessコマンドを動的に更新する方法はありますか?


141

私はwatchコマンドが好きですが、それに制限があります。

watchwith の機能を模倣できるかどうか知りたいですless。実行中のスクリプトを介して動的に変更されるディレクトリをスクロールする機能を主に探しています。


を探しておりtail -f foo.log | grep bar、tail / grepパイプラインを再起動してgrepコマンドを動的に変更できるようにします。
アレクサンダーミルズ

回答:


119

ではlessFファイルの最後まで読み続けるように入力できます(などtail -f)。入力:eしてファイル名を入力して別のファイルを表示できますが、残念ながら、現在のファイルの名前を入力lessしても、ファイルはリロードされません。しかし、それはによって提案され、現在のファイルの再読み込みを行うためのトリックがありますsabgentonタイプ:eと、存在しないファイルの名前を入力しますが、これにより、lessはエラーメッセージを表示し、現在のファイルをリロードします。

の代わりを探しているなら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

3
@PaulWaglandいいえ、Rファイルを確実に更新しません。画面を更新し、一部の入力バッファを消去しますが、すべての状況で実際にファイルからデータをリロードするわけではありません(ファイルが大きい場合にのみ、コードを深く掘り下げませんでした)。
ジル

65

Shift+Fless同様になりtailfます。つまり、ファイルにさらにデータが追加されると更新されます。


7
これは追加に対してのみ機能することに注意してください。行がインプレースで削除または編集された場合、lessそれらの変更は表示されません。
ナサニエルM.ビーバー

フォローモードを停止し、スクロール可能モードに再入するにはどうすればよいですか?
トム・ヘイル

1
<kbd> Ctrl + C </ kbd>
バルキ

1
balki私の経験では、これを使用すると、データをパイプするコマンドが強制終了されます$COMMAND | less。これの周りに良い方法があるのだろうか?次のようなことができます$COMMAND > /tmp/file & less /tmp/fileが、それはあまり良いことではありません。
肥満児RIGH

@AttRigh私は自分のコマンドを殺したことはありません(この方法で実行中のコマンドのログを読みますが、技術的にはあまりパイプしません)
イエナ

41

次のように入力します:

less +F filename

これは、エディター内で「F」を押すことをエミュレートします。


1
ありがとう。エイリアスalias check="less +F"をmyに追加しました.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
これは、別のプログラムからの出力によって中断された場合に備えて、画面を再描画します。常にファイルをリロードするわけではありません。コードの詳細を掘り下げてコードの機能を確認したことはありません。実験的に短いファイルはリロードされません。私は間違いなくマニュアルページに脅かされておらず、この説明は言葉遣いが不十分だと言います:「再ペイント」は入力が再読み込みされることを伝えておらず、実際の動作は「ファイルが変更されている場合に有用」ではありませんバグ私は、コマンドが行うことになっているかわからないので、私は知らない)..?
ジル

私は専門家ではなく、以下のソースコードも読んでいませんが、ファイルについて既に知っていることを忘れてリロードし、リロードした入力に基づいて出力を更新します。質問には、「lessコマンドを動的に更新する方法はありますか?」答える前に質問の説明をより徹底的に読んだ場合、「実行中のスクリプトを介して動的に変更されたディレクトリをスクロールする」と彼らは言うので、答えなかったかもしれません。それ以下は適切なコマンドではありません。
デステン

3バイトの長さのファイルを使用する場合でも、私にとっては問題ありません。大きなファイルに対しても機能しない理由は想像できません。
アディソン

1
すばらしいです!私にとっては、短いファイルと長いファイルの両方で機能します。1つlessのファイル名を使用してファイルを再オープンしませんでした-つまり、ファイルのinodeが変更されたとき(を使用してファイルを上書きmvするときなど)、古いファイルの内容が残っていました(おそらく古いiノードが再読み込みされました)- -2.最初に表示される行は、おそらく元のファイルの内容と同じバイトオフセットから始まります。したがって、行の長さが変わると、最初に表示される行が不完全になり、表示される行が上下に移動する可能性があります。
パブーク

R常に機能するとは限りません。unix.stackexchange.com/questions/4351/を
wisbucky

5

実行中の「F」キーはにless似た「フォロー」を行いますがtail -f、それがここで探しているものを達成するかどうかはわかりません。


5

私は通常、一度だけG出力をテーリングするために入力します。CIFSのようなネットワークファイルシステム上で特に役立ちます。


これは、より少ない時間で開かれたファイルのオンデマンドの更新です。ファイルの最後にジャンプすることに加えて、ファイルが変更されている場合は、ファイルを再ロードします。
jorb

1
ありがとう。私にとっては初めてではありませんでしたが、今では正常に動作しているようです。男では、ファイルを更新すると書かれていません。man less: 'Gまたは>またはESC->ファイルの行Nに移動します。デフォルトではファイルの最後です。ここで古い間違ったコメントを削除します。ごめんなさい。
ヤロスラフニキテンコ

1
ところで、あなたは「ワンタイムベース」と呼んでいますか?lessMark Nudelman のメンテナは次のように答えました。「Gコマンドは通常、Rコマンドのようにファイルの再読み取りを強制しません。Gのときにファイルの終わりがまだ読み取られていない場合、たとえば、Gで最後までジャンプしてから1Gで最初に戻ってから、別のプログラムがデータを変更すると、ファイルの最後までジャンプしてそこにあるデータを最初に読み取る必要があります。ファイルの終わり(長さを変更せずに)、 "(続き)
ヤロスラフニキテンコ

(続き)「Gで再び最後にジャンプすると、変更されたデータは表示されません。ただし、最後にジャンプして最初に戻っていない場合は、Gコマンドを最初に実行するときに読み取る必要がありますそこにあるデータは初めてであり、もちろん、最初に呼び出された回数が少ないために発生した変更も確認できます。 "
ヤロスラフニキテンコ

この場合、元の質問が尋ねている内容の一部である動的更新ではなく、1回限りの更新であると述べました。
-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変更:再ロードしないでください

iノードが変わるかどうかで違いが生じると思います(で確認できますls -i foo.txt)。iノードが変更されると、機能しRなくなります。


0

tail -f代わりにパイプすることもできますが、出力に従うことになります。ただし、出力を移動(スクロール)する機能は失われます。



0

私はこのスレッドを他の人と同じように見つけました。すでにファイルの最後にいる場合のソリューションを追加したいと思います。「g」の後に「G」を使用すると、ファイルが強制的に更新されます。

最終的には、ターミナルプログラム(SecureCRT)でこのためのマクロボタンを作成しました。マクロは単に「gG」です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.