web-dev-qa-db-ja.com

ファイルを「追跡」する方法を教えてください。

wgetによってファイルが順次ダウンロードされています。

cat myfile.tar.bz2 | tar -xjを使用して解凍を開始した場合、高速なものによっては、正しく解凍されるか、「予期しないEOF」で失敗する可能性があります。

ファイルを「キャットアンドフォロー」する方法、つまりファイルのコンテンツをstdoutに出力するが、EOFで終了せず、代わりにそのファイルにサブスクライブし続け、データの新しい部分を出力し続け、ファイルが閉じられた場合にのみ終了する方法ライターであり、N秒以内に再開されません。


@arielCoの answer に基づいてスクリプト cat_and_follow を作成しました。これにより、ファイルがもう書き込み用に開かれていないときにtailも終了します。

30
Vi.
tail +1f file

wgetがダウンロードしている間に、LibreOfficeソースtarballを使用してUbuntuでテストしました。

tail +1f libreoffice-4.2.5.2.tar.xz | tar -tvJf -

また、Solaris 10、RHEL3、AIX 5、およびBusybox 1.22.1のmy Android phone(use tail +1 -f fileとBusybox)。

22
arielCo

問題は、catがファイルがまだ追加されていることを認識していないことです。 catは、ファイルの(現在の)終わりに到達するとすぐに終了します。

これを回避するには、wgetをパイプ(またはFIFO)に書き込む必要があります。

wget -O - http://... | tar -xjf -
11
Hauke Laging

ファイルを最初から中断するまで読み取り、追跡するには

tail -fn +1 file

それを示すために、これを試してください(GNU CoreutilsでBashを想定):

(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.

(注:+1f他の人が言及したファイル名は、少なくともGNU tailコマンドで)解釈されます。

上記は単一のファイルに対して機能します。複数のファイルを連結しても、最初のファイルに頼らずにすべてのファイルを確定的に追跡することはできません。 「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.
5
James Haigh