Bash

如何連續連接目錄中的文件,以便看到最新文件的最後幾行?

  • March 4, 2021

我有一個腳本可以監聽 Twitter 並將帶有特定關鍵字的推文儲存在 JSON 文件中。每次腳本啟動時都會創建一個新的目標文件。

有時我的腳本崩潰並自動重新啟動,在此過程中創建一個新的 JSON 文件。

我想顯示傳入推文的執行日誌。使用單個文件,我可以做到這一點(管道jq僅顯示 JSON 中的單個欄位):

tail -f file1.json | jq '.text'

但是,一旦腳本崩潰並重新啟動,就會創建一個新文件(例如file2.json),並且上面的命令會監聽一個不再更新的文件。

為了解決這個問題,我認為我應該將目錄中的所有文件和tail -f | jq '.text'結果連接起來。

但是,雖然我可以cat *連接文件夾中目前的所有文件,但新文件似乎不會自動添加到連接中。

如何連續連接文件夾中的所有文件,以便始終可以看到最新文件的最新行?

該解決方案使用不可移植的tail -F(ie )。tail --follow=name --retry用 GNU 測試tail

進行如下操作:

  1. 創建monitored為正常文件:
: >>monitored
  1. 定期檢查是否有file*.jsonmonitored. 如果是這樣,請替換monitored為文件的硬連結:
while sleep 1; do
   find . \( -name . -o -prune \) -name 'file*.json' -newer monitored -exec ln -f {} monitored \;
done

上面的循環可以在後台執行。 3. 按照其名稱進行監控monitored

tail -F monitored

您可以通過管道傳輸jq '.text'或其他任何內容。

筆記:

  • 您的明確問題是:

如何連續連接文件夾中的所有文件,以便始終可以看到最新文件的最新行?

我的解決方案不會“連續連接”。不過,它允許您“查看最新文件的最新行”。

  • 如果在同一秒內創建/更新了許多file*.json文件,則無法保證它們中的每一個看起來都monitored只是片刻,有些可能會被跳過。但是,我了解您的腳本崩潰並偶爾會自動重新啟動,因此從一次重新啟動到下一次可能需要一秒鐘以上的時間。那麼就沒有問題了。

一般情況下可能有問題。我明確指出,當“最新文件”狀態過於頻繁地從一個文件跳到另一個文件時,該解決方案並不完全可靠。

如果要查看目前目錄中的所有文件,請使用以下構造:

ls | cat - <(inotifywait -m --format '%f' -e create . ) | while read file ; do tail -v -f "$file" & done

請注意,它支持在監視目錄中包含子目錄。

引用自:https://unix.stackexchange.com/questions/637212