【问题标题】:Tail log files within all subfolders所有子文件夹中的尾日志文件
【发布时间】:2016-01-23 01:46:37
【问题描述】:

我正在尝试编写一个简单的脚本,该脚本会查看所有 .log 文件并 grep 查找特定字符串,并根据其值发送一封电子邮件。

tail -f **/*.log | while read LOGLINE

do 
        [[ "${LOGLINE}" == *"complete!"* ]] && pkill -P $$ tail | 
                echo "LOG" | mutt -s "Test Passed!" abc@xyz.com

        [[ "${LOGLINE}" == *"FAILURE"* ]] && pkill -P $$ tail | 
                echo "LOG" | mutt -s "Test Failed!" abc@xyz.com

done

但是这给了我以下结果:

tail: cannot open `**/*.log' for reading: No such file or directory
tail: no files remaining

如果我提供了准确的路径,脚本就可以正常工作。 我怎样才能使父文件夹和所有子文件夹中的所有 .log 文件都能正常工作?

【问题讨论】:

  • 你想用**做什么?
  • @e0k 尝试遵循此处给出的示例:stackoverflow.com/questions/18321336/… 他们建议“*/.log”
  • 好的,**/ 来自globstar 选项,仅匹配目录和子目录。是否在 shell 中启用了 globstar 选项? .log文件是在当前目录下还是子目录下?

标签: linux shell tail


【解决方案1】:

在我的 bash shell 中,globstar 选项默认是关闭的。您可以使用

    shopt -s globstar

这应该允许将**/*.log 扩展到所有子目录。另见this article。看看这是否能找到你的 .log 文件。

注意:此功能是在 bash 4.0 中引入的。如果您使用的是旧版本,这将解释为什么代码不起作用(您的 shell 没有该功能)。

另一种方法是使用find。将**/*.log 替换为$(find . -name '*.log'),因此该行显示为

    tail -f $(find . -name '*.log') | while read LOGLINE

如果您没有某些子目录的权限,例如,它也可能会提供错误消息,这些消息会转到 stderr(文件 2)。您可以通过重定向删除它们

    $(find . -name '*.log' 2>/dev/null)

【讨论】:

  • 不,我得到一个无效的选项名称 $shopt -s globstar bash: shopt: globstar: 无效的 shell 选项名称(GNU bash,版本 3.2.25(1)-release (x86_64-redhat-linux -gnu))
  • 如果在 bash 提示符下只输入 shopt 会发生什么?它应该列出每个 shell 选项以及它是打开还是关闭。寻找globstar
  • 哦,我现在看到了问题,您使用的是旧版本的 bash。这个globstar 选项是在 4.0 中引入的(请参阅我的答案中的链接)。因此,您不能按预期使用 **/*.log 语法。
  • 顺便说一句,我强烈建议升级你的 bash,因为 shellshock 错误,这是一个安全问题。
  • 是的,正如你提到的,它是在 4.0 中添加的。唉,我无权升级它 - 它由 IT 严格控制,所以我会提出请求。还有其他方法吗?使用 find 递归查看所有 .log 文件并使用这些文件查找模式?感谢您的建议。
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
相关资源
最近更新 更多