【问题标题】:Tail the most recent file尾随最近的文件
【发布时间】:2016-01-22 23:44:42
【问题描述】:

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

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

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

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

我尝试做一些引号和括号的嵌套,但我不太了解引用的细节。 watch 将其命令传递给 sh 的事实使事情变得复杂,即使我使用的是 bash。

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

【问题讨论】:

  • hm..我真的不明白用例。你想实时读取几个文件吗?如果是,使用tail -f *.out 会更容易
  • 我一般同意@pivanchy,但值得一提的是,POSIX tail 不能保证一次处理多个文件。
  • @pivanchy 这就是解决方案。没想到这么简单。
  • @JeffIrwin 只要你没有真正创建新文件,就像我愉快地假设的那样。
  • @JeffIrwin 这不是因为 bash 只会全局化所有当前文件。

标签: linux bash tail


【解决方案1】:

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

 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

【讨论】:

  • 谢谢!我只需要像这样添加一个简单的文件过滤器:watch ls -t1 *.out | sed q | xargs tail"
  • @JeffIrwin 也试试编辑。它不再看文件,而是直接跟随输出(带尾)。
  • 编辑效果很好!我什至不会尝试了解所有管道。
【解决方案2】:

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

tail -f *.out

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

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

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 命令。

【讨论】:

    【解决方案3】:

    所以,我将复制一些我当前的答案: Tail the most recent file

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

    tail -f *.out
    

    tail 也可以处理多个文件,并且可以像这样使用它:

    tail -f file1 file2 file3
    

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

    【讨论】:

    • 这并不能解决 * 由 shell 评估的问题,因此在 tail 初始运行后创建的任何文件都不会被跟踪。
    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2020-06-09
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多