Quiero seguir un montón de nombres de directorios desconocidos que contienen un archivo particular inexistente, por ejemplo:
tail -F /tmp/*/app.log
Sin embargo, eso no funciona según lo previsto con el comodín: si creo un archivo con esa ruta, tail
no comenzará a seguirlo a menos que reinicie el comando. Por otro lado si ejecuto:
tail -F /tmp/example/app.log
Tan pronto como aparezca el archivo, el comando generará:tail: '/tmp/example/app.log' has appeared; following new file
He probado la -f filename --retry
combinación en lugar de -F
y el resultado es el mismo.
¿Cómo se puede solucionar esto? ¿Existen otras formas de lograr el mismo objetivo?
Respuesta1
/tmp/*/app.log
será expandido por el shell (BASH, supongo). Si existen coincidencias, esto se expandirá a esas coincidencias y luego se pasará como argumentos atail
$ 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
Así, en el caso anterior, tail
se configuraría para seguir específicamente app.log
en a
y app.log
en b
. Si en el momento de su inicio app.log
no b
existiera, no se seguiría. Si se crean nuevos directorios o archivos, tampoco los seguirá.
En caso de que no haya coincidencias, la cadena no expandida se pasará como argumento atail
$ echo /tmp/test/*/app2.log
/tmp/test/*/app2.log
Por lo tanto, intentará seguir la ruta literal/nombre de archivo /tmp/test/*/app2.log
, que probablemente nunca existirá (o si existe, se creó de una manera muy extraña porque tenerlo *
como nombre de directorio no es algo que recomendaría hacer en circunstancias normales). .