我有一个程序在运行时将其输出记录到* .out文件中。我设置了一个bash脚本来运行几个不同的时间,因此每次运行都会写入另一个* .out文件。我发现我可以tail
这样的最新* .out文件:
watch tail $(ls -tr *.out | tail -n1)
问题似乎是引用$()
只执行一次。因此,当第一次运行完成时,watch
继续tail
相同的* .out文件,即使现在有更新的* .out文件。
如何在一次运行结束后将其更改为转到下一个* .out文件?
我尝试了一些引号和括号的嵌套,但我并不真正理解引用的细节。 watch
将命令传递给sh
这一事实使事情变得复杂,即使我正在使用bash。
奖励积分:如果可以将其修改为tail -f
而不是每watch
秒重复n
,那就太棒了。
答案 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命令