tail 命令重试标志不适用于通配符?

tail 命令重试标志不适用于通配符?

我想要跟踪一堆包含特定不存在文件的未知目录名称,例如:

tail -F /tmp/*/app.log

但是,使用通配符时,它无法按预期工作:如果我使用该路径创建文件,tail除非我重新启动命令,否则不会开始跟踪。另一方面,如果我运行:

tail -F /tmp/example/app.log

一旦文件出现,命令就会输出:tail: '/tmp/example/app.log' has appeared; following new file

我尝试过-f filename --retry组合而不是-F,结果是一样的。

该如何解决这个问题?还有其他方法可以实现相同的目标吗?

答案1

/tmp/*/app.log将由 shell(我猜是 BASH)扩展。如果存在匹配项,则将扩展为这些匹配项,然后作为参数传递给tail

$ find /tmp/test -type f
/tmp/test/a/app.log                                                                                                                                                                                                                                
/tmp/test/b/app.log                  

$ echo /tmp/test/*/app.log                                                                                                                                                                                        
/tmp/test/a/app.log /tmp/test/b/app.log

因此,在上述情况下,tail将被配置为专门遵循和app.log。如果在启动时不存在,则不会遵循。如果创建了新目录或文件,它也不会遵循它们。aapp.logbapp.logb

如果没有匹配,未扩展的字符串将作为参数传递给tail

$ echo /tmp/test/*/app2.log                                                                                                                                                                                     
/tmp/test/*/app2.log               

因此,它将尝试遵循文字路径名/文件名/tmp/test/*/app2.log,该文本可能永远不会存在(或者如果它确实存在,它是以一种非常奇怪的方式创建的,因为*在正常情况下我不建议将其作为目录名)。

相关内容