代码之家  ›  专栏  ›  技术社区  ›  Jeff Irwin

尾随最近的文件

  •  5
  • Jeff Irwin  · 技术社区  · 9 年前

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

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

    问题似乎是 $() 只执行一次。所以当第一次运行结束时, watch 继续 同样的*。out文件,尽管现在有一个更新的*。输出文件。

    我怎么能把这个改成下一个*。一次运行完成后输出文件?

    我试着做了一些引号和括号的嵌套,但我并不真正理解引用的细节。事情因以下事实而变得复杂 将其命令传递给 sh ,尽管我在使用bash。

    加分:如果可以修改为 tail -f 而不是重复 每一个 n 秒。

    3 回复  |  直到 9 年前
        1
  •  3
  •   steffen    9 年前

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

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

    为了奖金需要有点疯狂。这个 tail 命令还支持参数 --pid 这使得 一旦参考PID失效,即失效。听起来不错?下面是一些可以使用的模式:

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

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

        2
  •  1
  •   kojiro    9 年前

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

    tail -f *.out
    

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

    但如果你不知道 tail -f 在开始之前,如果在拖尾过程中创建了任何新的输出文件,则需要重新启动拖尾。在这种情况下,假设您一次只向每个outfile写入一个,您可以执行以下操作:

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

    (上述要求 inotifywait ,包含在 inotify-tools 在Ubuntu等基于Debian的系统上。)它在后台监视当前目录中新创建的文件,跟踪创建的任何文件,并在创建新文件时终止上一个tail命令。

        3
  •  0
  •   Community CDub    8 年前

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

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

    tail -f *.out
    

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

    tail -f file1 file2 file3
    

    因此,正如您所看到的,这是一个非常强大和简单的工具,您不需要使用linux命令