特定の存在しないファイルを含む、一連の不明なディレクトリ名を 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
a
app.log
b
app.log
b
一致しない場合は、展開されていない文字列が引数として渡されます。tail
$ echo /tmp/test/*/app2.log
/tmp/test/*/app2.log
/tmp/test/*/app2.log
したがって、おそらく存在しないリテラルのパス名/ファイル名に従おうとします(存在する場合でも、*
通常の状況ではディレクトリ名として使用することはお勧めできないため、非常に奇妙な方法で作成されています)。