2016-01-22 108 views
5

我有一個程序在運行時將其輸出記錄到* .out文件。我設置了一個bash腳本來運行幾個不同的時間,所以每次運行都寫入一個不同的* .out文件。我發現我可以tail最新的* .out文件是這樣的:尾巴最近的文件

watch tail $(ls -tr *.out | tail -n1) 

這個問題似乎是在引用$()只被執行一次。所以當第一次運行結束時,watch繼續到tail相同的* .out文件,即使現在有一個更新的* .out文件。

如何在一次運行完成後將其更改爲轉到下一個* .out文件?

我試着做一些嵌套的引號和括號,但我不太瞭解引用的細節。 watch將命令傳遞給sh,儘管我使用的是bash,但事情很複雜。

獎勵積分:如果可以修改爲tail -f而不是僅僅重複watchn秒,那就太好了。

+2

嗯..我真的不明白的用例。你想實時閱讀幾個文件嗎?如果是的話,使用'tail -f * .out'更容易 – pivanchy

+0

我一般同意@pivanchy,但值得一提的是,POSIX'tail'不保證一次處理多個文件。 – kojiro

+0

@pivanchy是解決方案。我沒有意識到這很簡單。 –

回答

2

我也處理了這個問題,終於來到了此解決方案:

watch "ls -t1 | sed q | xargs tail" 

需要獲得獎金有點哈克。 tail命令也支持參數--pid,一旦引用的PID死機,就會使tail死掉。聽起來不錯?下面是一些你可以使用模式:

while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)/\1/g' | xargs tail -f --pid 2>/dev/null ; done 

這基本上跟蹤最新的文件,並在文件寫入過程結束重新啓動tail

+0

謝謝!我只需添加一個簡單的文件過濾器就可以了:'watch ls -t1 * .out | sed q | xargs tail「' –

+1

@JeffIrwin同樣嘗試編輯,它不再觀察文件,而是直接跟蹤輸出(尾部)。 – steffen

+1

編輯工作的很棒!我甚至不會去理解所有的管道。 –

1

因此,我將複製一個小我目前的回答是: Tail the most recent file

,你可以用很簡單的命令來解決此問題:

tail -f *.out 

尾部有多個文件也可行,這是可能的使用它,如:

tail -f file1 file2 file3 

所以,你可以看到,這是非常強大和簡單易用的工具,你不需要用linux命令打ŝ

1

如果存在的所有文件,首先,你有一個現代化的實現tail,可以處理多個文件,

tail -f *.out 

似乎是最好的解決辦法。但是如果你沒有所有的文件開頭,那麼如果你剛創建它們,它仍然是最簡單的。 *.out將只擴展到您已擁有的文件。

但是,如果在啓動之前無法知道tail -f的文件名,那麼如果在拖尾時創建了任何新的outfiles,則需要重新啓動尾部。在這種情況下,給你一次只能寫入每個OUTFILE一個,你可以這樣做:

inotifywait -m -e create -q . | while read dir event file; do 
    kill %tail 
    tail -f "$file" & 
done 
kill %tail 

(以上需要inotifywait,它包括在inotify-tools基於Debian的系統,如Ubuntu的)。這手錶新創建文件的當前目錄,創建的文件的尾部,在後臺創建,並在創建新文件時終止前一個尾部命令。