Флаг повтора команды tail не работает с подстановочными знаками?

Флаг повтора команды tail не работает с подстановочными знаками?

Я хочу отследить ряд неизвестных имен каталогов, содержащих определенный несуществующий файл, например:

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.login b. Если на момент запуска app.login bне существовало, то следовать за ним не будет. Если создаются новые каталоги или файлы, то следовать за ними также не будет.

В случае отсутствия совпадений неразвернутая строка будет передана в качестве аргументаtail

$ echo /tmp/test/*/app2.log                                                                                                                                                                                     
/tmp/test/*/app2.log               

Таким образом, он попытается следовать буквальному пути/имени файла /tmp/test/*/app2.log, который, скорее всего, никогда не будет существовать (или, если он существует, то был создан очень странным образом, поскольку использование *имени каталога — это не то, что я бы советовал делать в обычных обстоятельствах).

Связанный контент