尾部最近的文件
Tail the most recent file
我有一个程序在 运行ning 时将其输出记录到 *.out 文件。我将 bash 脚本设置为 运行 几次不同的时间,因此每次 运行 都写入不同的 *.out 文件。我发现我可以像这样 tail
最近的 *.out 文件:
watch tail $(ls -tr *.out | tail -n1)
问题似乎是引用 $()
只执行一次。因此,当第一个 运行 完成时,watch
继续 tail
相同的 *.out 文件,即使现在有更新的 *.out 文件。
我如何更改它以在一个 运行 完成后转到下一个 *.out 文件?
我试着做了一些引号和括号的嵌套,但我不太了解引用的细节。 watch
将其命令传递给 sh
,即使我使用的是 bash.
,事情也变得复杂了
奖励积分:如果可以将其修改为 tail -f
而不是每隔 n
秒重复 watch
就好了。
我也处理过这个问题,最后得出这个解决方案:
watch "ls -t1 | sed q | xargs tail"
需要花点功夫才能获得奖金。 tail
命令还支持一个参数 --pid
,它使 tail
在引用的 PID 终止时立即终止。听起来不错?以下是您可以使用的一些模式:
while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)//g' | xargs tail -f --pid 2>/dev/null ; done
这基本上跟踪最新的文件并在文件写入过程结束时重新启动tail
。
所以,我将复制一些我当前的答案:
您可以使用非常简单的命令来解决您的问题:
tail -f *.out
tail 也适用于多个文件,可以像这样使用它:
tail -f file1 file2 file3
因此,如您所见,它是一个非常强大且简单的工具,您不需要使用 linux 命令
如果所有文件都存在,并且您拥有可以处理多个文件的 tail
的现代实现,
tail -f *.out
似乎是最好的解决方案。但是,如果您没有开始时的所有文件,那么直接创建它们仍然是最简单的方法。 *.out
只会扩展到您已有的文件。
但是,如果您在开始之前不知道 tail -f
的文件名,那么如果在跟踪时创建了任何新的输出文件,则需要重新启动 tail。在那种情况下,鉴于您一次只写入每个输出文件,您可以这样做:
inotifywait -m -e create -q . | while read dir event file; do
kill %tail
tail -f "$file" &
done
kill %tail
(上面需要 inotifywait
,它包含在 Debian-based 系统上的 inotify-tools
中,例如 Ubuntu。)它监视当前目录中新创建的文件,tails无论创建哪个文件,都会在后台创建,并在创建新文件时终止先前的 tail 命令。
我有一个程序在 运行ning 时将其输出记录到 *.out 文件。我将 bash 脚本设置为 运行 几次不同的时间,因此每次 运行 都写入不同的 *.out 文件。我发现我可以像这样 tail
最近的 *.out 文件:
watch tail $(ls -tr *.out | tail -n1)
问题似乎是引用 $()
只执行一次。因此,当第一个 运行 完成时,watch
继续 tail
相同的 *.out 文件,即使现在有更新的 *.out 文件。
我如何更改它以在一个 运行 完成后转到下一个 *.out 文件?
我试着做了一些引号和括号的嵌套,但我不太了解引用的细节。 watch
将其命令传递给 sh
,即使我使用的是 bash.
奖励积分:如果可以将其修改为 tail -f
而不是每隔 n
秒重复 watch
就好了。
我也处理过这个问题,最后得出这个解决方案:
watch "ls -t1 | sed q | xargs tail"
需要花点功夫才能获得奖金。 tail
命令还支持一个参数 --pid
,它使 tail
在引用的 PID 终止时立即终止。听起来不错?以下是您可以使用的一些模式:
while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)//g' | xargs tail -f --pid 2>/dev/null ; done
这基本上跟踪最新的文件并在文件写入过程结束时重新启动tail
。
所以,我将复制一些我当前的答案:
您可以使用非常简单的命令来解决您的问题:
tail -f *.out
tail 也适用于多个文件,可以像这样使用它:
tail -f file1 file2 file3
因此,如您所见,它是一个非常强大且简单的工具,您不需要使用 linux 命令
如果所有文件都存在,并且您拥有可以处理多个文件的 tail
的现代实现,
tail -f *.out
似乎是最好的解决方案。但是,如果您没有开始时的所有文件,那么直接创建它们仍然是最简单的方法。 *.out
只会扩展到您已有的文件。
但是,如果您在开始之前不知道 tail -f
的文件名,那么如果在跟踪时创建了任何新的输出文件,则需要重新启动 tail。在那种情况下,鉴于您一次只写入每个输出文件,您可以这样做:
inotifywait -m -e create -q . | while read dir event file; do
kill %tail
tail -f "$file" &
done
kill %tail
(上面需要 inotifywait
,它包含在 Debian-based 系统上的 inotify-tools
中,例如 Ubuntu。)它监视当前目录中新创建的文件,tails无论创建哪个文件,都会在后台创建,并在创建新文件时终止先前的 tail 命令。