[英]Tail the most recent file
我有一個程序在運行時將其輸出記錄到* .out文件。 我設置了一個bash腳本來運行幾個不同的時間,因此每次運行都會寫入另一個* .out文件。 我發現我可以像這樣tail
最近的* .out文件:
watch tail $(ls -tr *.out | tail -n1)
問題似乎是引用$()
只執行一次。 因此,當第一次運行完成時,即使現在有一個較新的* .out文件, watch
仍繼續tail
相同的* .out文件。
如何在一次運行結束后將其更改為轉到下一個* .out文件?
我嘗試了一些引號和括號的嵌套,但我並不真正理解引用的細節。 即使我使用bash, watch
也會將命令傳遞給sh
,這很復雜。
獎勵積分:如果可以將其修改為tail -f
而不是每隔n
秒重復watch
那將會很棒。
我也處理了這個問題,最后得出了這個解決方案:
watch "ls -t1 | sed q | xargs tail"
需要得到一點hacky獎金。 所述tail
命令還支持一個參數--pid
這使得tail
只要引用PID死亡死亡。 聽起來不錯? 這是你可以使用的一些模式:
while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)/\1/g' | xargs tail -f --pid 2>/dev/null ; done
這基本上跟蹤最新文件,並在文件寫入過程結束時重新啟動tail
。
如果所有文件都存在,並且您有一個可以處理多個文件的tail
的現代實現,
tail -f *.out
似乎是最好的解決方案。 但是如果你沒有開始的所有文件,那么如果你剛創建它們仍然是最簡單的。 *.out
將僅擴展到您已有的文件。
但是如果你在開始之前無法知道tail -f
的文件名,那么如果在拖尾時創建任何新的outfiles,你將需要重新啟動tail。 在這種情況下,假設您一次只寫一個outfile,您可以這樣做:
inotifywait -m -e create -q . | while read dir event file; do
kill %tail
tail -f "$file" &
done
kill %tail
(以上需要inotifywait
,它包含在基於Debian的系統(如Ubuntu)上的inotify-tools
。)它在inotifywait
新創建文件的當前目錄,創建任何文件的尾部,並在每次執行時終止前一個tail命令。新文件已創建。
所以,我將重復一點我目前的答案: 尾巴最近的文件
您可以使用非常簡單的命令來解決您的問題:
tail -f *.out
tail也適用於多個文件,可以像以下一樣使用它:
tail -f file1 file2 file3
所以,正如你所看到的,它是非常強大而簡單的工具,你不需要使用linux命令
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.