我如何“跟踪”一个文件?

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 一起使用)。

  • 在 Ubuntu 中,`tail +1f` 不起作用。你必须做`tail -n +1` (4认同)
  • 我没想到 `tail` 可以与 binray 文件一起使用... (2认同)

Hau*_*ing 11

问题是cat不知道该文件仍在附加。一旦cat遇到文件的(当前)结尾,它就会退出。

wget为了避免这种情况,您必须写入管道(或 FIFO)。

wget -O - http://... | tar -xjf -
Run Code Online (Sandbox Code Playgroud)

  • 或者 `curl`,默认输出到 stdout。并且 (1) `-f -` 是多余的,`tar` 默认从 stdin 读取,并且 (2) 大多数 `tar` 可以自动检测压缩,因此 `j` 通常是不必要的。`卷曲http://... | 焦油x` (7认同)
  • @维。你可以像这样使用 `tee` 来保存文件: `curl http://... | T恤....tbz | tar -xj`,但恢复下载比再次调用相同的命令要复杂得多。 (3认同)
  • 这将在不保存解压文件的情况下进行下载。如果网络不好,它也会阻碍继续下载。 (2认同)

Jam*_*igh 7

阅读并遵循从一开始就文件,直到打断:

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)