4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

tailコマンドで新規作成ファイルを追って表示

Posted at

やりたいこと

新規に作成されるlogファイルを追跡して表示する。関数などは作らずにワンライナーで実現できるようにする。

tailコマンドの基本的な機能

tailコマンドでlogファイルを表示し続けるには

$ tail -f file.log

# 一旦file.logがリネームや消去をされて新たにfile.logが作成されても表示し続ける
$ tail -F file.log 

のどちらかを使えば事足りるが、別名で新たなファイルが作成されたときにそれらを追跡して表示し続けるにはtailコマンドだけで完結させるのは無理。

tailコマンドで最新ファイルの表示

file1.log, file2.log ... などの新たな別名のファイルにログが追加されているときに一番最新のファイルを表示するには

$ tail -f $(ls -tr file*.log | tail -n 1)

でいい。しかし、$(ls -tr file*.log | tail -n 1)部分はコマンドを打ったときの一回のみ実行されるため、その後新たなファイルができたとしても追跡して表示はしてくれない。

場合によってはダメなパターン

$ watch -n 60 -c "ls -tr file*.log  | tail -n 1 | xargs tail"

とすれば60秒ごとに監視して新しいファイルができた場合にそちらを表示する。watchコマンドの-cはテキスト内のカラー表示。概ねこれでやりたいことは達成できるが、ログファイルにtqdmなどでプログレスバーを表示させたり復帰の\rが入っていると普通のtail -fでは正常に表示してくれてもこの方法だと表示が崩れる。

常に良いパターン

$ while : ; do timeout 60 tail -f $(ls -tr file*.log | tail -n 1)  ; done

watchコマンド内でのtailコマンドは復帰がある場合の表示が崩れるので無限ループとtimeoutを組み合わせた方法を使うことにより、通常のtailコマンドの結果を表示できるので表示も崩れない。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?