tailコマンドは最後の行を表示しません

tailコマンドは最後の行を表示しません

ファイルが変更されるたびに最後の行を読み取るために、次のコマンドを使用しています。

tail -f -n1 Entrie.txt

最初に書いた行は問題なく表示されますが、後で2行目を書くと次のエラーが発生します。

tail: Entrie.txt: file truncated

そのエラーが表示された後、ファイルに書き込まれたすべての値が表示されます。 しかし、それだけでなく、何行も書き込んだ後、エラーが出なくなり修正されるのですが、常に正常に動作する必要があります。

私はこのコマンドを Linux で実行しています。

エディターでファイルに行を追加して保存しています。

答え1

新しいバージョンを書き込むか、現在のファイルにデータを追加することで、ファイルを変更できます。

シェルの例:

  • date > sample_file.txt- 新しいテキスト(dateコマンドの出力)でファイルを再作成します
  • date >> sample_file.txt- 現在のファイルにテキストを追加します

最初のケースのシナリオ - ファイルが切り捨てられ (コンテンツが削除され、再作成されました。テキスト エディターで単純に「書き込み」するだけで実行できます)、tailこれについて警告が表示されます。 2 番目のケース -tail意図したとおりに動作します。

答え2

テキストエディタがファイルを保存するとき、よくあるのは、一時的ファイルをコピーし、元のファイルを空にして(切り捨てて)、一時ファイルの内容を元のファイルにコピーします。これは、元のファイルの権限、所有権、その他のメタデータを変更しないようにするためです。

これは、の観点から見るとtail、ファイルが切り捨てられ(空にされ)、ファイルの最後の行が表示されることを意味します。編集者が書き直しているので(そのため、ファイル全体が表示されます)。

tailコマンドが常にファイルの最後の行のみを表示し、それ以外は何も表示しないようにファイルに行を追加するには、次の点に注意する必要があります。追加ファイルに行を追加します。テキストエディタは通常リライトファイルの場合は、他の手段を使用してこれを行う必要がある場合があります。

ファイルにデータを追加する非常に基本的な方法は、以下を使用することですcat

cat >>Entrie.txt

これにより、 がcatファイルに追加されますEntrie.txt。 は入力を待機し、ターミナルからファイルに直接入力できるようになります。 を押すとすぐに、現在の行がファイルの末尾に書き込まれますEnter。データの入力を停止するには、Ctrl+D空の行で を押します。

ただし、これを一度押すと、前の行に書き込んだ内容を修正する機会がなくなるのは明らかですEnter

別の方法としては、別のファイル(例えば )で新しい行をadditions.txtエディタで編集する方法があります。そのファイルを保存して、

cat additions.txt >>Entrie.txt

これにより、 の完全な内容がadditions.txtファイルの末尾に追加されますEntrie.txt

関連情報