繁体   English   中英

尾巴最近的文件

[英]Tail the most recent file

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

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

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

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

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

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

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

 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

如果所有文件都存在,并且您有一个可以处理多个文件的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 。)它在inotifywait新创建文件的当前目录,创建任何文件的尾部,并在每次执行时终止前一个tail命令。新文件已创建。

所以,我将重复一点我目前的答案: 尾巴最近的文件

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

tail -f *.out

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

tail -f file1 file2 file3

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM