尾随最新文件

时间:2016-01-22 23:44:42

标签: linux bash tail

我有一个程序在运行时将其输出记录到* .out文件中。我设置了一个bash脚本来运行几个不同的时间,因此每次运行都会写入另一个* .out文件。我发现我可以tail这样的最新* .out文件:

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

问题似乎是引用$()只执行一次。因此,当第一次运行完成时,watch继续tail相同的* .out文件,即使现在有更新的* .out文件。

如何在一次运行结束后将其更改为转到下一个* .out文件?

我尝试了一些引号和括号的嵌套,但我并不真正理解引用的细节。 watch将命令传递给sh这一事实使事情变得复杂,即使我正在使用bash。

奖励积分:如果可以将其修改为tail -f而不是每watch秒重复n,那就太棒了。

3 个答案:

答案 0 :(得分:2)

我也处理了这个问题,最后得出了这个解决方案:

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

需要得到一点hacky奖金。 tail命令还支持参数--pid,这使得tail一旦引用的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

答案 1 :(得分:1)

如果所有文件都存在,并且您有一个可以处理多个文件的tail的现代实现,

tail -f *.out

似乎是最好的解决方案。但如果您没有开始使用所有文件,那么如果您刚创建它们仍然是最简单的。 *.out只会扩展到您已有的文件。

但是,如果在开始之前无法知道tail -f的文件名,那么如果在拖尾时创建了任何新的outfiles,则需要重新启动tail。在这种情况下,鉴于您一次只能写入每个outfile,您可以这样做:

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

(以上需要inotifywait,它包含在基于Debian的系统(如Ubuntu)上的inotify-tools中。)它在后台监视新创建的文件的当前目录,以及创建的文件的尾部,并在创建新文件时终止前一个tail命令。

答案 2 :(得分:0)

所以,我将重复一点我目前的答案: Tail the most recent file

您可以使用非常简单的命令来解决您的问题:

tail -f *.out

tail也适用于多个文件,可以像以下一样使用它:

tail -f file1 file2 file3

所以,正如你所看到的,它是非常强大而简单的工具,你不需要使用linux命令