tail在linux中动态创建文件

时间:2015-12-02 06:29:52

标签: linux tail

我在目录下有一个文件列表,如下所示,

file1
file2
file3
....
....

文件将由进程动态创建。

现在当我做tail -f file* > data.txt时,

file * 仅接受目录中的现有文件。

(例如)

现有文件:

file1
file2

我这样做:tail -f file* > data.txt

当正在创建一个名为 file3 的新文件时,

(这里我需要在尾部包含file3而不重启命令)

然而,我需要停止尾巴并再次启动它,以便动态创建的文件也会尾随。

有没有办法在创建新文件或为此解决方法时动态地包含尾部文件。

2 个答案:

答案 0 :(得分:1)

我有一个满足大多数但不是全部您的要求的anwser:

您可以使用

tail -f --follow=name --retry file1 file2 file3 > data.txt

这将继续打开文件1,2,3,直到它们可用。即使打开文件消失并再次出现,它也会继续打印输出。

示例用法:

首先创建两个虚拟文件:

echo a >> file1
echo b >> file2

现在使用tail(在单独的窗口中):

tail -f --follow=name --retry file1 file2 file3 > data.txt

现在附加一些数据并进行其他操作:

echo b >> file2
echo c >> file3
rm file1
echo a >> file1

现在这是最终输出。注意所有三个文件都被考虑在内,即使它们在某个时刻不存在:

==> file1 <==
a

==> file2 <==
b
tail: cannot open ‘file3’ for reading: No such file or directory

==> file2 <==
b
tail: ‘file3’ has become accessible

==> file3 <==
c
tail: ‘file1’ has become inaccessible: No such file or directory

==> file1 <==
a

备注:这不适用于file*,因为这是一个在执行前展开的glob模式。假设您这样做:

tail -f file*

并且只存在file1和file2;然后tail得到输入:

tail -f file1 file2

glob扩展无法知道哪些文件最终会与模式匹配。所以这是一个部分答案:如果您知道将要创建的文件的所有可能名称;这样就可以了。

答案 1 :(得分:1)

您可以使用inotifywait通知您在目录中创建的任何文件。阅读输出并开始新的tail -f作为每个新文件的后台进程。