2016-01-22 6 views
5

は、私が実行している場合* .outのファイルに出力をログに記録したプログラムを持っています。私はいくつかの異なる時間を走らせるためにbashスクリプトを設定したので、それぞれの実行は異なる* .outファイルに書き込まれます。私は、このような最新の*の.outファイルをtailことが分かっ:テール最新のファイル

watch tail $(ls -tr *.out | tail -n1) 

問題が参照$()は一回だけ実行されることをあるように思われます。最初の実行が終了するので、watchは今、新しい* .outというファイルがあっても、tailに同じ*の.outファイルを続けています。

どのように私は1回の実行が終了した後の次の* .outのファイルに移動するには、これを変更することができますか?

私は引用符や括弧のいくつかのネストをやってみましたが、私は本当に参照の詳細を理解していません。事項はwatchはI bashを使っているにもかかわらず、shにそのコマンドを渡すという事実によって複雑にされています。

ボーナスポイント:watch毎にn秒を繰り返すのではなく、これをtail -fに変更することができれば素晴らしいことでしょう。

+2

hm ..私は本当にユースケースを理解していません。あなたはリアルタイムでいくつかのファイルを読みたいですか? 'tail -f * .out'を使う方が簡単です。 – pivanchy

+0

私は一般的に@pivanchyに同意しますが、POSIXの' tail'は一度に複数のファイルを扱うことは保証されていません。 – kojiro

+0

@pivanchyそれは解決策です。私はそれがそれほど単純ではなかったことを理解していません –

答えて

2

また、私はこの問題に対処し、最終的にこの溶液に来た:

watch "ls -t1 | sed q | xargs tail" 

はボーナスのために少しハック取得する必要があります。 tailコマンドもtailとすぐに参照PIDが死ぬと死ぬ可能引数--pidをサポートしています。いいですね?ここでは使用することができ、いくつかのパターンがあります:

while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)/\1/g' | xargs tail -f --pid 2>/dev/null ; done 

これは、基本的には、最新のファイルを追跡し、ファイル書き込み処理が終了したときにtailを再起動します。

+0

ありがとう!私はちょうどこのような単純なファイルフィルタを追加しなければなりません: 'watch ls -t1 * .out | | xargs tail "' –

+1

@JeffIrwin編集を試してみてください。それ以上ファイルを見ていませんが、出力をそのまま続けます(末尾)。 – steffen

+1

編集がうまくいきます!私はすべてのパイプラインを理解しようとしません。 –

1

だから、私は少し私の現在の答え複製します: Tail the most recent file

を、あなたの問題を解決するのは非常に簡単なコマンドを使用できます。

tail -f *.out 

尾はあまりにも、複数のファイルで動作し、それが可能です以下のようにそれを使用する:あなたが見ることができるように

tail -f file1 file2 file3 

、それは非常に強力かつ簡単なツールだとあなたは、Linuxのコマンドを使用してプレイする必要はありません。

tail -f *.out 

が最善の解決策になるように思われる、すべてのファイルがそもそも存在し、複数のファイルを扱うことができるtailの近代的な実装を持っている場合は

1

ね。しかし、すべてのファイルを最初から作成していない場合は、作成したばかりのファイルがまだ簡単になります。 *.outは既に持っているファイルだけに展開されます。

しかし、開始する前にtail -fのファイル名がわからない場合は、テールリング中に新しいアウトファイルが作成された場合は、tailを再起動する必要があります。その場合、あなたは一度に1 OUTFILEそれぞれに書いている与えられた、あなたが行うことができます:

inotifywait -m -e create -q . | while read dir event file; do 
    kill %tail 
    tail -f "$file" & 
done 
kill %tail 

を(上記は、UbuntuのようなDebianベースのシステムでinotify-toolsに含まれているinotifywaitが必要です。)それは時計新しく作成されたファイルの現在のディレクトリは、作成されたファイルをバックグラウンドでテールし、新しいファイルが作成されるたびに前のtailコマンドを強制終了します。

関連する問題