![如何连续连接目录中的文件以便看到最新文件的最后几行?](https://linux22.com/image/188923/%E5%A6%82%E4%BD%95%E8%BF%9E%E7%BB%AD%E8%BF%9E%E6%8E%A5%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E4%BB%A5%E4%BE%BF%E7%9C%8B%E5%88%B0%E6%9C%80%E6%96%B0%E6%96%87%E4%BB%B6%E7%9A%84%E6%9C%80%E5%90%8E%E5%87%A0%E8%A1%8C%EF%BC%9F.png)
我有一个脚本,可以监听 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
。
请按如下方式进行:
创建
monitored
为常规文件:: >>monitored
定期检查是否有
file*.json
比monitored
.如果是这样,请替换monitored
为该文件的硬链接:while sleep 1; do find . \( -name . -o -prune \) -name 'file*.json' -newer monitored -exec ln -f {} monitored \; done
上面的循环可以在后台运行。
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
请注意,它才不是支持在监视目录中包含子目录。