我想要跟踪一堆包含特定不存在文件的未知目录名称,例如:
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
。如果在启动时不存在,则不会遵循。如果创建了新目录或文件,它也不会遵循它们。a
app.log
b
app.log
b
如果没有匹配,未扩展的字符串将作为参数传递给tail
$ echo /tmp/test/*/app2.log
/tmp/test/*/app2.log
因此,它将尝试遵循文字路径名/文件名/tmp/test/*/app2.log
,该文本可能永远不会存在(或者如果它确实存在,它是以一种非常奇怪的方式创建的,因为*
在正常情况下我不建议将其作为目录名)。