我想追蹤一堆包含特定不存在檔案的未知目錄名稱,例如:
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
ina
和app.log
in b
。如果在啟動時app.log
inb
不存在,則不會遵循。如果建立了新的目錄或文件,它也不會跟隨它們。
在沒有匹配的情況下,未擴展的字串將作為參數傳遞給tail
$ echo /tmp/test/*/app2.log
/tmp/test/*/app2.log
因此,它將嘗試遵循文字 pathname/filename /tmp/test/*/app2.log
,這可能永遠不會存在(或者如果它確實存在,它是以一種非常奇怪的方式創建的,因為*
在正常情況下我不建議使用目錄名稱) 。