我在目录下有一个文件列表,如下所示,
file1
file2
file3
....
....
文件将由进程动态创建。
现在当我做tail -f file* > data.txt
时,
file * 仅接受目录中的现有文件。
(例如)
现有文件:
file1
file2
我这样做:tail -f file* > data.txt
当正在创建一个名为 file3 的新文件时,
(这里我需要在尾部包含file3而不重启命令)
然而,我需要停止尾巴并再次启动它,以便动态创建的文件也会尾随。
有没有办法在创建新文件或为此解决方法时动态地包含尾部文件。
答案 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
作为每个新文件的后台进程。