尾部最近的文件

Tail the most recent file

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

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

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

我如何更改它以在一个 运行 完成后转到下一个 *.out 文件?

我试着做了一些引号和括号的嵌套,但我不太了解引用的细节。 watch 将其命令传递给 sh,即使我使用的是 bash.

,事情也变得复杂了

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

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

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

需要花点功夫才能获得奖金。 tail 命令还支持一个参数 --pid,它使 tail 在引用的 PID 终止时立即终止。听起来不错?以下是您可以使用的一些模式:

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

这基本上跟踪最新的文件并在文件写入过程结束时重新启动tail

所以,我将复制一些我当前的答案:

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

tail -f *.out

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

tail -f file1 file2 file3

因此,如您所见,它是一个非常强大且简单的工具,您不需要使用 linux 命令

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

tail -f *.out

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

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

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

(上面需要 inotifywait,它包含在 Debian-based 系统上的 inotify-tools 中,例如 Ubuntu。)它监视当前目录中新创建的文件,tails无论创建哪个文件,都会在后台创建,并在创建新文件时终止先前的 tail 命令。