Bash
如何連續連接目錄中的文件,以便看到最新文件的最後幾行?
我有一個腳本可以監聽 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
。進行如下操作:
- 創建
monitored
為正常文件:: >>monitored
- 定期檢查是否有
file*.json
比monitored
. 如果是這樣,請替換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
請注意,它不支持在監視目錄中包含子目錄。