Solaris 中是否有命令可以读取文件,并且当文件到达末尾时,按照 tail 的方式进行流式传输?我需要从头开始读取文件,它是一个二进制文件。
如果您能提供有关 Solaris 和 Linux 的信息,我们将非常感激。
答案1
tail -9999f
会做一些接近你想要的事情。如果你的文件更大,请添加更多 9。
问题:
- 二进制文件可能没有换行符。
tail -f
将等待换行符后再打印任何内容。 - Solaris 上的版本
tail
(你没有提到哪个Solaris(但这可能无关紧要)可能不支持该选项。它可能支持tail -n 9999 -f
。您可能必须获取 tail 的 GNU 版本。 - 由于文件不断增大,因此在确定文件大小和启动尾部进程之间存在竞争条件。如果您没有要求它获取足够的行,您可能会错过文件的开头。
tail
不知道您何时真正完成了对文件的写入,因此您的gzip
进程也永远不会完成。我不确定当您ctrl-c
结束tail
进程时会发生什么,但很可能 gzip 会在完成后自行清理并删除它正在处理的文件。
我的建议是启动原始程序并将输出通过管道传输到 gzip,如下所示:
./my_program | gunzip > new_file.txt
这样,如果my_program
速度很慢,gunzip 将会等待,但是当文件真正结束时,my_program
完成指示,它仍然会完成。
您可能需要重写程序以写入 STDOUT 而不是直接写入文件。
编辑:
看了手册页,上述三个问题都可以解决。使用选项-c <bytes>
代替可以-n <lines>
缓解问题 1。使用-n +0
或-c +0
可以缓解问题 3。使用--pid=<PID>
将使 tail 在原始程序(以 运行<PID>
)终止时终止,从而缓解问题 4。
答案2
在 Linux 中,您可以使用tail -f -n +0 /path/filename
它来查看它。虽然 -n 通常是指要打印文件末尾的行数,但传递时+<n>
它会从文件开头的第 n 行开始。
从tail --help
:
-n, --lines=K output the last K lines, instead of the last 10;
or use -n +K to output lines starting with the Kth