Vi.*_*Vi. 33 pipe tail open-files files cat
正在按顺序下载文件wget
。
如果我开始用 解压它cat myfile.tar.bz2 | tar -xj
,它可能会正确解压或因“意外 EOF”而失败,具体取决于哪个速度更快。
如何“跟踪”文件,即将文件内容输出到标准输出,但不要在 EOF 上退出,而是继续订阅该文件并继续输出数据的新部分,仅在文件被关闭时退出writer 并且在 N 秒内没有重新打开。
我根据@arielCo 的回答创建了一个脚本cat_and_follow,该脚本也终止了不再打开文件进行写入的时间。tail
ari*_*lCo 26
tail +1f file
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 上使用 LibreOffice 源 tarball 在wget
下载它时对其进行了测试:
tail +1f libreoffice-4.2.5.2.tar.xz | tar -tvJf -
Run Code Online (Sandbox Code Playgroud)
它也适用于我的 Android 手机中的 Solaris 10、RHEL3、AIX 5 和 Busybox 1.22.1(tail +1 -f file
与 Busybox 一起使用)。
Hau*_*ing 11
问题是cat
不知道该文件仍在附加。一旦cat
遇到文件的(当前)结尾,它就会退出。
wget
为了避免这种情况,您必须写入管道(或 FIFO)。
wget -O - http://... | tar -xjf -
Run Code Online (Sandbox Code Playgroud)
要阅读并遵循从一开始就文件,直到打断:
tail -fn +1 file
Run Code Online (Sandbox Code Playgroud)
为了证明这一点,试试这个(假设 Bash 和 GNU Coreutils):
(while true; do printf . >> /tmp/file; sleep 1; done)&
tail -fn +1 /tmp/file # (Ctrl-C to interrupt, of course, or otherwise kill it.)
kill % # Kills the while-loop.
Run Code Online (Sandbox Code Playgroud)
(注意:+1f
其他人提到的被解释为文件名,至少在 GNUtail
命令中是这样。)
以上适用于单个文件。多个文件的串联将无法确定性地跟踪所有文件,而不会挂在第一个文件上。要' cat and follow ',只跟踪最后一个文件,可以使用进程替换。这是另一个演示:
printf file1 > /tmp/file1; printf file2 > /tmp/file2
(while true; do printf . | tee -a /tmp/file{1,2} > /dev/null; sleep 1; done)&
cat /tmp/file1 <(tail -fn +1 /tmp/file2) # (Interrupt or kill it.)
kill % # Kills the while-loop.
Run Code Online (Sandbox Code Playgroud)