ファイルを「キャットしてフォロー」するにはどうすればよいですか?


31

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

でアンパックを開始するとcat myfile.tar.bz2 | tar -xj、何が速いかに応じて、正しくアンパックされるか、「Unexpected EOF」で失敗する場合があります。

ファイルを "cat and follow"する方法、つまりファイルの内容をstdoutに出力しますが、EOFで終了せず、代わりにそのファイルにサブスクライブし続け、データの新しい部分を出力し続けます。ライターであり、N秒以内に再オープンされません。


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


2
tailフォローオプションを備えたコマンドを探していると思います。
ケシュラム14年

tailバイナリファイルでも動作しますか?
Vi。

2
また好むかもしれませんless +F
mikeserv 14年

あなたがあなたの解決策を見つけたのは知っていますが、疑問があります。なぜ単純にしないのですか?wget ... && tar xjvf ...
ジョセフR. 14年

@JosephR。、1.並列化により時間を節約します。2.システムの負荷を均等にするには(リソースを集中的に使用するフルスロットルアンパックフェーズを回避/最小化する)。3.後で「アンパック」コマンドを思い出す(またはスケジュールする)ことや、最初にチェーンコマンドを入力することを避けるため(まだアンパックするかどうかわからないとき)。
Vi。

回答:


22
tail +1f file

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

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

また、Solaris 10、RHEL3、AIX 5、Android搭載のBusybox 1.22.1(Busyboxで使用tail +1 -f file)でも動作します。


1
ダウンロードが終了すると自動的に終了しますか?「フォロワー」が/proc/*/fd/定期的にスキャンし、ファイルが正常に閉じられているかどうかをチェックすることを期待しています。
Vi。

2
tailbinrayファイルで機能するとは思っていませんでした...
Vi。

/proc/../fdと自動終了をスキャンするスクリプトを作成しました。
Vi。

1
GNU tailは必要ありません-f。オプションが標準だと思います。ただし、ダウンロードが終了しても自動的には終了しません。
バーマー14

4
Ubuntuでは動作tail +1fしません。あなたがしなければならないtail -n +1
-dangonfast

11

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

あなたは確認する必要がありwget、これを避けるために、パイプ(またはFIFO)への書き込みを。

wget -O - http://... | tar -xjf -

7
またはcurl、デフォルトで標準出力に出力します。(1)-f -冗長であり、tarデフォルトでstdinから読み取ります。(2)ほとんどtarのsは圧縮を自動的に検出できるため、j多くの場合不要です。 curl http://... | tar x
ケビン14年

2
解凍されたファイルを保存せずにダウンロードします。また、それは悪いネットワークの場合にはダウンロードを続けることを妨げます。
Vi。

3
@Vi。teeこのように使用してファイルを保存できcurl http://… | tee ….tbz | tar -xjますが、ダウンロードを再開するのは、同じコマンドを再度呼び出すよりも複雑になります。
カスペルド14年

5

するために読んで従って中断されるまで、最初からファイルを:

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.

これはうまくいきましたが、tail +1f fileうまくいきませんでした。
therealfarfetched

この答えはよりもはるかに優れているtail +1fなど、他のオプションと組み合わせたときに--pid
ジョセフK.シュトラウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.