簡體   English   中英

尾巴最近的文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM