Quero seguir vários nomes de diretórios desconhecidos contendo um arquivo inexistente específico, por exemplo:
tail -F /tmp/*/app.log
No entanto, isso não funciona como esperado com o curinga: se eu criar um arquivo com esse caminho, tail
não começarei a seguir a menos que eu reinicie o comando. Por outro lado, se eu executar:
tail -F /tmp/example/app.log
assim que o arquivo aparecer, o comando irá gerar:tail: '/tmp/example/app.log' has appeared; following new file
Eu tentei a -f filename --retry
combinação em vez de -F
e o resultado é o mesmo.
Como isso pode ser resolvido e existem outras maneiras de atingir o mesmo objetivo?
Responder1
/tmp/*/app.log
será expandido pelo shell (BASH, presumo). Se existirem correspondências, então isso será expandido para essas correspondências e depois passado como argumentos paratail
$ 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
Portanto, no caso acima, tail
seria configurado para seguir especificamente app.log
in a
e app.log
in b
. Se, no momento em que foi iniciado, app.log
não b
existisse, não seria seguido. Se novos diretórios ou arquivos forem criados, ele também não os seguirá.
No caso de não haver correspondências, a string não expandida será passada como argumento paratail
$ echo /tmp/test/*/app2.log
/tmp/test/*/app2.log
Então, ele tentará seguir o literal pathname/filename /tmp/test/*/app2.log
, que provavelmente nunca existirá (ou se existir, foi criado de uma maneira muito estranha porque ter *
um nome de diretório não é algo que eu recomendaria fazer em circunstâncias normais) .