
Я хочу отследить ряд неизвестных имен каталогов, содержащих определенный несуществующий файл, например:
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
будет расширен оболочкой (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
за in a
и app.log
in b
. Если на момент запуска app.log
in b
не существовало, то следовать за ним не будет. Если создаются новые каталоги или файлы, то следовать за ними также не будет.
В случае отсутствия совпадений неразвернутая строка будет передана в качестве аргументаtail
$ echo /tmp/test/*/app2.log
/tmp/test/*/app2.log
Таким образом, он попытается следовать буквальному пути/имени файла /tmp/test/*/app2.log
, который, скорее всего, никогда не будет существовать (или, если он существует, то был создан очень странным образом, поскольку использование *
имени каталога — это не то, что я бы советовал делать в обычных обстоятельствах).