2016-01-22 110 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的)。这手表新创建文件的当前目录,创建的文件的尾部,在后台创建,并在创建新文件时终止前一个尾部命令。