如何连续连接目录中的文件以便看到最新文件的最后几行?

如何连续连接目录中的文件以便看到最新文件的最后几行?

我有一个脚本,可以监听 Twitter 并将带有特定关键字的推文存储在 JSON 文件中。每次脚本启动时都会创建一个新的目标文件。

有时我的脚本会崩溃并自动重新启动,并在此过程中创建一个新的 JSON 文件。

我想显示传入推文的运行日志。使用单个文件,我可以执行此操作(通过管道传输以jq仅显示 JSON 中的单个字段):

tail -f file1.json | jq '.text'

但是,一旦脚本崩溃并重新启动,就会创建一个新文件(例如file2.json),并且上述命令侦听不再更新的文件。

为了解决这个问题,我想我也许应该连接目录中的所有文件和tail -f | jq '.text'结果。

然而,虽然我可以做cat *要连接文件夹中当前的所有文件,新文件似乎不会自动添加到连接中。

如何连续串联文件夹中的所有文件,以便我始终可以看到最新文件的最新行?

答案1

该解决方案使用不可移植的tail -F(ie )。tail --follow=name --retry使用 GNU 进行测试tail

请按如下方式进行:

  1. 创建monitored为常规文件:

    : >>monitored
    
  2. 定期检查是否有file*.jsonmonitored.如果是这样,请替换monitored为该文件的硬链接:

    while sleep 1; do
        find . \( -name . -o -prune \) -name 'file*.json' -newer monitored -exec ln -f {} monitored \;
    done
    

    上面的循环可以在后台运行。

  3. monitored通过名称进行监控:

    tail -F monitored
    

    你可以通过管道jq '.text'或其他方式。

笔记:

  • 您的明确问题是:

    如何连续串联文件夹中的所有文件,以便我始终可以看到最新文件的最新行?

    我的解决方案不会“连续连接”。不过,它允许您“查看最新文件的最新行”。

  • 如果file*.json在同一秒内创建/更新了许多文件,则不能保证每个文件monitored都只出现一会儿,有些文件可以被跳过。不过,我了解您的脚本偶尔会崩溃并自动重新启动,因此从一次重新启动到下一次重新启动可能需要一秒钟以上的时间。那么就没有问题了。

    一般情况下可能会出现问题。我明确指出,当“最新文件”状态从一个文件跳转到另一个文件过于频繁时,该解决方案并不完全可靠。

答案2

如果你想查看当前目录中的所有文件,请使用以下结构:

ls | cat - <(inotifywait -m --format '%f' -e create . ) | while read file ; do tail -v -f "$file" & done

请注意,它才不是支持在监视目录中包含子目录。

答案3

卡米尔的回答为我指明了正确的方向,即使用硬链接和tail -F.

我采用了以下解决方案:

  1. watch定期重新创建指向最新文件的硬链接:
watch -n 300 'ln -f $(find . | sort --reverse | head -n1) ./latest.json'
  1. 用于tail -F连续查看硬链接文件的最新行:
tail -F latest.json | jq '.text' 

相关内容